我有一堂这样的课:
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)"}
处理这个问题的最佳方法是什么?我已经尝试插入自定义契约(Contract)解析器,但我不想对所有事情都这样做。有没有办法可以覆盖标记化,以便可以将其视为空?或者其他一些可以利用的可扩展性点?
最佳答案
最简单的事情可能是将 JSON 加载到 JObject
然后将 "(null)"
字符串标记替换为实际的 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; }
}
或者,您可以完全删除伪空值属性:
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>();
关于c# - 处理 Newtonsoft.JSON 中的 "(null)"值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33171689/