通过JSON.NET序列化任意数据时,任何null属性都将写入JSON
"propertyName":null
当然,这是正确的.
但是我要求自动将所有空值转换为默认的空值,例如null strings应该变为String.Emptynull,int?s应该变为0null,bool?s应该是false,等等.
NullValueHandling没有帮助,因为我不想Ignore空,但我也不想要Include它们(嗯,新功能?).
所以我转向实施自定义JsonConverter.
虽然实现本身是轻而易举的,但不幸的是,这仍然CanConvert()无法工作 - 永远不会调用具有null值的属性,因此WriteJson()也不会调用它.显然空值会自动序列化null,而不需要自定义管道.
例如,以下是空字符串的自定义转换器示例:
public class StringConverter : JsonConverter
{
public override bool CanConvert(Type objectType)
{
return typeof(string).IsAssignableFrom(objectType);
}
...
public override void WriteJson(JsonWriter writer,
object value,
JsonSerializer serializer)
{
string strValue = value as string;
if (strValue == null)
{
writer.WriteValue(String.Empty);
}
else
{
writer.WriteValue(strValue);
}
}
} …Run Code Online (Sandbox Code Playgroud) 我有一个使用 Json.NET v7.0.1 的 C# 应用程序。作为 REST 调用的结果,我以以下形式返回了一些 JSON:
{
"messages": [ {"phoneNumber":"123-456-7890", "smsText":"abcd1234="},
{"phoneNumber":"234-567-8901", "smsText":"efgh5678="},
{"phoneNumber":"345-678-9012", "smsText":"12345asdf"} ]
}
Run Code Online (Sandbox Code Playgroud)
如果没有要返回的消息数据,返回的 JSON 如下所示:
{
"messages": [ ]
}
Run Code Online (Sandbox Code Playgroud)
我的 Message 类如下所示:
public class Message
{
public string PhoneNumber { get; set; }
public string SmsText { get; set; }
public Message()
{
}
public Message(string phoneNumber, string smsText)
{
PhoneNumber = phoneNumber;
SmsText = smsText;
}
}
Run Code Online (Sandbox Code Playgroud)
当我尝试反序列化 JSON 时,我使用了以下代码:
Message[] messages = JsonConvert.DeserializeObject<Message[]>(json, new JsonSerializerSettings
{
MissingMemberHandling = MissingMemberHandling.Ignore …Run Code Online (Sandbox Code Playgroud)