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

标签 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)"}

处理这个问题的最佳方法是什么?我已经尝试插入自定义契约(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/

相关文章:

python - Databricks - Pyspark - 使用动态键处理嵌套的 json

c# - 当字符串比较断言看起来应该通过时却失败

c# - 使用 CameraCaptureTask 时保持应用程序线程事件

c# - 在 C# 中使用日期对字符串列表进行排序

c# - 存储库是否应该在 Entity Framework 1.0 中使用相同的上下文实例

jQuery 通过 JSON 自动完成来自 ASMX 的名称/值对

c# - 如何在 MVC 模型中表示一个月的复选框

javascript - 如何在 JavaScript 中以正确的格式格式化日期

c# - 键值未知时反序列化 JSON

c# - JSON序列化中属性名称的默认驼峰式大小写