Как заменить несколько значений в файле json, используя c#? - PullRequest
0 голосов
/ 04 февраля 2020

Мне нужно заменить имя файла и расположение в файле json новым значением, если номер API существует в json, или же следует добавить новый массив json с API, файлом и местоположением. Я написал foreach l oop сделать это, но каждый раз, когда содержимое добавляется в список, условие if берет новый API, добавленный и сравнивает со списком, так что он продолжает добавлять тот же API снова и снова в json файл. PLZ помогает мне решить эту проблему. .

List<DPIndex> items = JsonConvert.DeserializeObject<List<DPIndex>>(json);

foreach (var item in items)
{
    foreach (var list in dpIndexList)
    {
        if (item.API == list.API)
        {

            item.File = list.File;
            item.Location = list.Location;
        }
        else
        {
            item.API = list.API;
            item.File = list.File;
            item.Location = list.Location;

        }
    }
    dpNewIndexList.Add(item);
}

string dpIdxObj = JsonConvert.SerializeObject(dpNewIndexList, Formatting.Indented);

Json Файл как ниже:

[
  {
    "API": "422833682700000000",
    "File": "daf420.dat.07-31-2019",
    "Location": 2922
  },
  {
    "API": "422833682700000000",
    "File": "daf420.dat.07-31-2019",
    "Location": 2922
  }
]

Ответы [ 2 ]

0 голосов
/ 04 февраля 2020

Вот код, который добавит элемент к dpIndexList, если там нет элемента с таким «API», или обновит элемент в этом списке, если существует элемент с таким «API»:

foreach (var item in items)
{
    // Check if the item with such API already exists in dpIndexList
    var foundItem = dpIndexList.FirstOrDefault(dpItem => dpItem.API == item.API);

    if (foundItem != null)
    {
        // Exists. Update the item in dpIndexList
        foundItem.File = item.File;
        foundItem.Location = item.Location;
    }
    else
    {
        // Doesn't exist. Adding to dpIndexList
        dpIndexList.Add(item);
    }
}

Для тестирования локально я использовал следующие фиктивные списки, и это сработало:

var dpIndexList = new List<DPIndex>()
{
    new DPIndex
    {
        API = "1",
        File = "File_1_ORIG",
        Location = 1111
    },
    new DPIndex
    {
        API = "2",
        File = "File_2_ORIG",
        Location = 2222
    },
};

var items = new List<DPIndex>()
{
    // Item, which exists in dpIndexList (should update the original)
    new DPIndex
    {
        API = "2",
        File = "File_2_UPDATE",
        Location = 3333
    },
    // New item, which doesn't exist in dpIndexList (should be added)
    new DPIndex
    {
        API = "3",
        File = "File_3_NEW",
        Location = 3333,
    },
    // Item, which should UPDATE the one above (should update that one)
    new DPIndex
    {
        API = "3",
        File = "File_3_UPDATED",
        Location = 3333
    },
};

PS Не забудьте добавить using System.Linq; в начало файла.

0 голосов
/ 04 февраля 2020

После прохождения вашего кода. Похоже, что вы получаете значения из одного и того же объекта и меняете его снова и снова. Посмотрите на пример ниже

List<DPIndex> dpIndexList = new List<DPIndex>();
DPIndex index = new DPIndex() { 
    API = "API.1",
    File="API1",
    Location="1"
};
dpIndexList.Add(index);
index.API = "API.2";

Как вы можете видеть, я добавил индексный объект в List dpIndexList, но после добавления я изменил значение API в том же индексном объекте, которое также приводит к изменению значения в dpIndex List. Вы делаете то же самое с элементом здесь, вы меняете его состояние в каждой итерации. Таким образом, в конце все значения станут тем, что было последней итерацией цикла. Я говорю, что вы создаете объект в каждой итерации и добавляете его в список. И для обновления используйте lambda

foreach (var item in items)
{
    foreach (var list in dpIndexList)
    {
        DPIndex it = new DPIndex();
        if (item.API == list.API)
        {
            it.File = list.File;
            it.Location = list.Location;
            dpNewIndexList.RemoveAll(x=> x.API == list.API);
        }
        else
        {
            it.API = list.API;
            it.File = list.File;
            it.Location = list.Location;
        }
        dpNewIndexList.Add(it);
    }
}

Я полагаю, это поможет вам

...