Удалить определенные свойства из объекта JSON в соответствии со схемой JSON - PullRequest
1 голос
/ 21 марта 2019

JSON-схема:

{
   "title": "Amenities",
   "additionalProperties": false,
   "properties": {
      "Footer": {
         "type": "string",
         "editType": "textarea"
      },
      "RowType": {
         "type": "integer",
         "editType": null
      },
      "answers": {
            "type": "array",
            "items": {
                "type": "object",
                "properties": {
                    "answer": {
                        "type": "integer",
                        "editType": null
                    },
                    "FooterInner": {
                     "type": "string",
                     "editType": "textarea"
                  }
                }
            }
        }
   },
   "type": "object"
}

JSON-объект:

{
   "Footer": "",
   "RowType": 0,
   "answers": [
      {
         "answer": 1,
         "FooterInner": "innerfooter"
      },
      {
         "answer": 2,
         "FooterInner": "innerfooter2"
      }
   ]
}

Мне нужно найти свойства с "type=integer" в JSON-схеме и удалить эти свойства из JSON Object.

Ожидаемый объект JSON:

{
   "Footer": "",
   "answers": [
      {
         "FooterInner": "innerfooter"
      },
      {
         "FooterInner": "innerfooter2"
      }
   ]
}

Объекты схемы JSON и JSON могут различаться, поэтому мне нужно проверить и удалить свойства "type=integer" из любого типа объекта JSON.

Iискали и не смогли найти что-то полезное, и главная проблема в том, что в JSON может быть несколько вложенных элементов.

Может быть, мне нужно написать рекурсивную итеративную функцию, есть ли какое-нибудь существующее решение?

Ответы [ 2 ]

2 голосов
/ 22 марта 2019

Вот решение:

Вместо поиска "type=integer" свойств в схеме я сделал это в объекте JSON.

Но, сначала я проверил JSON object по JSON schema, чтобы убедиться, что в JSON object.

нет никаких дополнительных свойств.

1.Step - Проверка объекта JSON по схеме JSON:

JsonValue loadedSchema = JsonValue.Parse(jsonSchema);
var schema = JsonSchemaFactory.FromJson(loadedSchema);
JsonValue loadedObject = JsonValue.Parse(json);
var schemaValidationResult = schema.Validate(loadedObject);

Если 1.Step в порядке, выполнить 2.Step

2.Step - Удалить свойства типа Integer, Boolean и Float из объекта JSON:

static void Main(string[] args)
{
    var json =
        @"{
           ""Footer"": ""footer"",
                ""RowType"": 4,
                ""answers"": 
                [
                    {
                        ""answer"": 1,
                        ""FooterInner"": ""innerfooter""
                    },
                    {
                        ""answer"": 2,
                        ""FooterInner"": ""innerfooter2""
                    }
                ]
            }";
    JToken nodeList = JToken.Parse(json);
    List<JTokenType> typesToRemove = new List<JTokenType>(){JTokenType.Boolean, JTokenType.Float, JTokenType.Integer};

    removeFields(nodeList, typesToRemove);

    Console.WriteLine(nodeList.ToString());
    Console.ReadKey();
}

private static void removeFields(JToken token, List<JTokenType> typesToRemove)
{
    JContainer container = token as JContainer;
    if (container == null) return;

    List<JToken> removeList = new List<JToken>();
    foreach (JToken el in container.Children())
    {
        JProperty p = el as JProperty;
        if (p != null && typesToRemove.Contains(p.Value.Type))
        {
            removeList.Add(el);
        }

        removeFields(el, typesToRemove);
    }

    foreach (JToken el in removeList)
    {
        el.Remove();
    }
}
0 голосов
/ 21 марта 2019

Я думаю, что у вас есть 2 варианта:

  1. Написать собственный конвертер json (см. Пользовательская десериализация с использованием Json.NET ).
  2. Использовать динамические объекты(Jobjects, JTokens) с json.net.
...