处理"(null)" Newtonsoft.JSON中的值

时间:2015-10-16 13:25:54

标签: c# json json.net

我有一个这样的课程:

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?或者其他一些可扩展点可以利用?

1 个答案:

答案 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>();