Указатель NULL
- это тот, который указывает на никуда. Когда вы разыскиваете указатель p
, вы говорите «дайте мне данные в месте, хранящемся в« p ». Когда p
является нулевым указателем, местоположение, хранящееся в p
, является nowhere
, вы говорите «Дайте мне данные в месте« нигде ». Очевидно, он не может этого сделать, поэтому он выбрасывает NULL pointer exception
.
В общем, это потому, что что-то не было правильно инициализировано.
Как и Джеймс Ньютон Кинг: Если вы сами создаете сериализатор, а не используете JavaScriptConvert, то есть свойство NullValueHandling
, которое вы можете установить для игнорирования.
Вот пример :
JsonSerializer _jsonWriter = new JsonSerializer {
NullValueHandling = NullValueHandling.Ignore
};
В качестве альтернативы, как предложено @amit
JsonConvert.SerializeObject(myObject,
Newtonsoft.Json.Formatting.None,
new JsonSerializerSettings {
NullValueHandling = NullValueHandling.Ignore
});
Вы можете сделать это, чтобы игнорировать все нули в объекте, который вы сериализуете, и все нулевые свойства не будут отображаться в JSON
JsonSerializerSettings settings = new JsonSerializerSettings();
settings.NullValueHandling = NullValueHandling.Ignore;
var myJson = JsonConvert.SerializeObject(myObject, settings);
Чтобы немного разъяснить очень полезный ответ GlennG (перевод синтаксиса с C # на VB.Net не всегда «очевиден»), вы также можете украсить отдельные свойства класса, чтобы управлять обработкой нулевых значений. Если вы это сделаете, не используйте глобальную настройку JsonSerializerSettings из предложения GlennG, иначе она переопределит отдельные украшения. Это пригодится, если вы хотите, чтобы в JSON появился нулевой элемент, поэтому потребителю не нужно выполнять какую-либо специальную обработку. Если, например, потребитель должен знать, что массив необязательных элементов обычно доступен, но в настоящее время пуст ... Украшение в объявлении свойства выглядит следующим образом:
<JsonPropertyAttribute("MyProperty", DefaultValueHandling:=NullValueHandling.Include)> Public Property MyProperty As New List(of String)
Для этих свойств вы не хотят вообще появляться в изменении JSON: = NullValueHandling. Включить в: = NullValueHandling.Ignore. Кстати, я обнаружил, что вы можете украсить свойство как для XML, так и для JSON-сериализации просто отлично (просто поместите их рядом друг с другом). Это дает мне возможность называть сериализатор XML в dotnet или сериализаторе NewtonSoft по своему усмотрению - оба работают бок о бок, а мои клиенты имеют возможность работать с XML или JSON. Это гладкий, как сопли на дверной ручке, так как у меня есть клиенты, которым нужны оба!
Адаптация к ответу @ Mrchief's / @ amit, но для людей, использующих VB
Dim JSONOut As String = JsonConvert.SerializeObject(
myContainerObject,
New JsonSerializerSettings With {
.NullValueHandling = NullValueHandling.Ignore
}
)
См.: «Инициализаторы объектов: именованные и анонимные типы (Visual Basic)»
Вот вариант, похожий, но дает другой выбор:
public class DefaultJsonSerializer : JsonSerializerSettings
{
public DefaultJsonSerializer()
{
NullValueHandling = NullValueHandling.Ignore;
}
}
Затем я использую его следующим образом:
JsonConvert.SerializeObject(postObj, new DefaultJsonSerializer());
Разница здесь в том, что:
JsonSerializerSettings
каждого используемого места. Как видно из этой ссылки на их сайте (http://james.newtonking.com/archive/2009/10/23/efficient-json-with-json-net-reducing-serialized-json-size. aspx) Я поддерживаю использование [Default ()] для указания значений по умолчанию
Взято из ссылки
public class Invoice
{
public string Company { get; set; }
public decimal Amount { get; set; }
// false is default value of bool
public bool Paid { get; set; }
// null is default value of nullable
public DateTime? PaidDate { get; set; }
// customize default values
[DefaultValue(30)]
public int FollowUpDays { get; set; }
[DefaultValue("")]
public string FollowUpEmailAddress { get; set; }
}
Invoice invoice = new Invoice
{
Company = "Acme Ltd.",
Amount = 50.0m,
Paid = false,
FollowUpDays = 30,
FollowUpEmailAddress = string.Empty,
PaidDate = null
};
string included = JsonConvert.SerializeObject(invoice,
Formatting.Indented,
new JsonSerializerSettings { });
// {
// "Company": "Acme Ltd.",
// "Amount": 50.0,
// "Paid": false,
// "PaidDate": null,
// "FollowUpDays": 30,
// "FollowUpEmailAddress": ""
// }
string ignored = JsonConvert.SerializeObject(invoice,
Formatting.Indented,
new JsonSerializerSettings { DefaultValueHandling = DefaultValueHandling.Ignore });
// {
// "Company": "Acme Ltd.",
// "Amount": 50.0
// }
Альтернативное решение с использованием атрибута JsonProperty
:
[JsonProperty(NullValueHandling=NullValueHandling.Ignore)]
//or
[JsonProperty("property_name", NullValueHandling=NullValueHandling.Ignore)]
Как показано в , этот онлайн-документ .
var settings = new JsonSerializerSettings();
settings.ContractResolver = new CamelCasePropertyNamesContractResolver();
settings.NullValueHandling = NullValueHandling.Ignore;
//you can add multiple settings and then use it
var bodyAsJson = JsonConvert.SerializeObject(body, Formatting.Indented, settings);
Как и ответ @ sirthomas, JSON.NET также уважает свойство EmitDefaultValue
на DataMemberAttribute
:
[DataMember(Name="property_name", EmitDefaultValue=false)]
Это может быть желательно, если вы уже используете [DataContract]
и [DataMember]
в вашем типе модели и не хотите добавлять JSON.NET-специфичные атрибуты.
Вы можете написать: [JsonProperty("property_name",DefaultValueHandling = DefaultValueHandling.Ignore)]
Он также заботится о том, чтобы не сериализовать свойства со значениями по умолчанию (не только null). Он может быть полезен, например, для перечислений.
JsonSerializerSettings
notJsonSerializer
, поскольку он показал ошибку для последнего – Yazan 24 February 2016 в 09:08