我有一个这样的课程:
public class MyClass
{
public DateTimeOffset DateCreated { get; set; }
public string Name { get; set; }
public User User {get;set;}
}
我正在调用一个有时将空值表示为"(null)"的服务,如下所示:
{"name":"(null)", "dateCreated":"(null)", "user":"(null)"}
处理此问题的最佳方法是什么?我已经尝试插入自定义合约解析器,但我不想为所有事情做这件事。有没有办法可以覆盖标记化,这样可以将其视为null?或者其他一些可扩展点可以利用?
答案 0 :(得分:2)
最简单的做法是将JSON加载到JObject
,然后用实际的空标记替换"(null)"
字符串标记:
var obj = JObject.Parse(jsonString);
foreach (var value in obj.Descendants().OfType<JValue>().Where(v => v.Type == JTokenType.String && (string)v == "(null)").ToList())
value.Replace(JValue.CreateNull());
var myClass = obj.ToObject<MyClass>();
请注意,您需要将DateTimeOffset
属性更改为可为空的属性:
public class MyClass
{
public DateTimeOffset? DateCreated { get; set; }
public string Name { get; set; }
public User User { get; set; }
}
或者,你可以完全删除psuedo-null-valued属性:
var obj = JObject.Parse(jsonString);
foreach (var value in obj.Descendants().OfType<JValue>().Where(v => v.Type == JTokenType.String && (string)v == "(null)").ToList())
{
if (value.Parent.Type == JTokenType.Property)
value.Parent.Remove(); // Psuedo null-valued object property. Remove the property.
else
value.Replace(JValue.CreateNull()); // Psuedo null-valued array entry. Replace with null to avoid reindexing the array.
}
var myClass = obj.ToObject<MyClass>();