2015-03-25 1 views
5

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

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

Дело в том, что при добавлении свойства NullValueHandling к NullValueHandling.Ignore каждое свойство null игнорируется, но только если оно является частью «обычного» .Net-объекта. Каждое свойство null внутри 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}); 

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

+3

Это действительно поможет, если вы могли бы дать краткую, но полную программу, демонстрирующую проблему. –

+1

Пропущенная «нулевая» запись массива изменит индексы; в этом случае вам нужно иметь дело с ним вручную. –

+1

Этот код не может скомпилировать, потому что 1) нет типа Foo (нет, это не nitpicking, потому что проблема может потенциально быть в определении этого типа каким-то образом) и 2) вы не можете назначить нулевой литерал свойство анонимного типа. – erikkallen

ответ

15

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

"source2": { 
    "z": null 
    } 

    "source2": { 
    } 

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

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

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

Простой. Большое спасибо! –

+0

Это не работает, когда анонимный объект имеет свойство Array, у которого есть объекты с нулевым свойством, в основном это ** не ** проверяет рекурсивно. – Fwd079

+0

@ Fwd079 - он проверяет рекурсивно, но параметр не применяется к записям коллекции. Из [docs] (http://www.newtonsoft.com/json/help/html/T_Newtonsoft_Json_NullValueHandling.htm): * Игнорировать: игнорировать нулевые значения при сериализации и десериализации ** объектов **. * Чтобы пропустить определенные записи коллекции, см., возможно, [Исключая конкретные элементы в коллекции при сериализации в JSON] (https://stackoverflow.com/questions/20955722) или [Сериализация и сборка пользовательских контрактов JSON.Net] (https://stackoverflow.com/questions/38038793) – dbc

Смежные вопросы