удаление свойств из сложного json объекта - PullRequest
0 голосов
/ 04 мая 2020

Я пытаюсь удалить некоторые свойства, которые являются динамическими c входными данными из JObject (преобразованы json в JObject). я могу сделать это на родительских элементах, но не на вложенных дочерних элементах. INPUT

 {
  "id": 1,
  "name": "something",
  "marks": [
    {
      "pid": 1000,
      "sub": "AAA",
      "rank": 2
    },
    {
      "pid": 1001,
      "sub": "BBB",
      "rank": 10
    }
  ]
}

Теперь я хочу удалить идентификатор из родительского элемента и pid из каждого свойства меток в json. Этот список является динамическим c и может увеличиться в будущем. приведенные выше данные приведены в качестве примера, но исходный список (пометки в примере) содержит более 20 свойств.

CODE TRIED (который удаляет только свойство id из родительского объекта)

string[] props = new string[] { "id", "pid" };
JObject jObject = JsonConvert.DeserializeObject<JObject>(str.ToLower());
if (jObject != null)
{
    jObject.Properties()
           .Where(attr => props.Contains(attr.Name))
           .ToList()
           .ForEach(attr => attr.Remove());
}

1 Ответ

1 голос
/ 04 мая 2020

Вы можете создать функцию и вызывать ее рекурсивно, если вложенные значения JObject или JArray, например, следующий код:

1 - Создать основную функцию RemoveIds:

public static void RemoveIds(JObject jObject, string[] props)
{
    List<JProperty> jProperties = jObject.Properties().ToList();

    for (int i = 0; i < jProperties.Count; i++)
    {
        JProperty jProperty = jProperties[i];
        if (jProperty.Value.Type == JTokenType.Array)
        {
            RemoveFromArray((JArray)jProperty.Value, props);
        }
        else if (jProperty.Value.Type == JTokenType.Object)
        {
            RemoveIds((JObject)jProperty.Value, props);
        }
        else if (props.Contains(jProperty.Name))
        {
            jProperty.Remove();
        }
    }
}

2 - Создать простой метод RemoveFromArray, который вызывает главную функцию внутри al oop:

private static void RemoveFromArray(JArray jArray, string[] props)
{
    foreach(JObject jObject in jArray)
    {
        RemoveIds(jObject, props);
    }
}

3 - Вызывать основную функцию в коде, например:

JObject jObject = JsonConvert.DeserializeObject<JObject>(json.ToLower());
if (jObject != null)
{
    RemoveIds(jObject, new string[] { "id", "pid" });

    Console.WriteLine(jObject);
}

4 - Результат:

{
  "name": "something",
  "marks": [
    {
      "sub": "aaa",
      "rank": 2
    },
    {
      "sub": "bbb",
      "rank": 10
    }
  ]
}

Надеюсь, вы найдете это полезным.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...