Newtonsoft Json.Net сериализация JObject не игнорирует нули, даже с правильными настройками

Я пытаюсь сериализовать объект с помощью Newtonsoft Json.Net.

этот объект является анонимным типом, заполненным множеством гетерогенных вещей, в основном регулярных POCOs, но и некоторых JObjectили JArrays.

дело в том, что при добавлении NullValueHandling свойство NullValueHandling.Ignore, каждое свойство null игнорируется, но только если оно является частью "обычного" объекта .Net. Каждое свойство null внутри a JObject или JArray остается.

вот минимальный пример:

var jobj = JObject.FromObject(new Anything{
    x = 1,
    y = "bla",
    z = null
});

var poco = new Foo {
   foo1 = "bar",
   foo2 = null
};

var serialized = JsonConvert.SerializeObject(new {
    source1 = poco,
    source2 = jobj
}, Newtonsoft.Json.Formatting.None, new JsonSerializerSettings { NullValueHandling = NullValueHandling.Ignore});

есть ли простой способ игнорировать эти нулевые значения ? Я пропустил какой-то параметр настройки ? Или мне придется заниматься этим вручную ?

1 ответов


A "null" значение JObject на самом деле non-null JValue С JValue.Type равна JTokenType.Null. Он представляет значение JSON null, когда такое значение фактически появляется в JSON. Я считаю, что он существует, чтобы захватить разницу между следующими двумя объектами JSON:

  "source2": {
    "z": null
  }

  "source2": {
  }

в первом случае собственность "z" представляет null значение JSON. Во втором случае свойство "z" не подарок. Linq-to-JSON представляет первый случай с нулевым типом JValue вместо JProperty.Value на самом деле быть null.

чтобы предотвратить попадание нулевых токенов в ваш JObjectзначения, используйте соответствующую настройку сериализатора при создании JObject:

        var jobj = JObject.FromObject(new
        {
            x = 1,
            y = "bla",
            z = (int?)null
        }, new JsonSerializer { NullValueHandling = NullValueHandling.Ignore } );