首页 > 解决方案 > 如何在 C# 中处理半结构化 JSON 数据

问题描述

在 C# 中处理半结构化 JSON 数据的最佳方法是什么?如果您有嵌套对象,最终其中一个会返回 null,您将如何处理?您将如何处理意外的嵌套空对象?编写多个 if 语句只是为了检查它是否为空是很麻烦的,因为嵌套对象可以是“N”个数量。使用 3rd 方 API,您不能总是期望它们返回结构化数据集。

例子:

[{
    "ID": 0
    , "WeatherName": "Rain"
    , "Location": "San Francisco"
    , "Details": null
},{
    "ID": 1
    , "WeatherName": "Snow"
    , "Location": "New York"
    , "Details": {
        "Population": 1234567
      , "Traffic": null
    }
},{
    "ID": 2
    , "WeatherName": "Fire"
    , "Location": "Sacramento"
    , "Details": {
        "Population": 1234567
       ,"Traffic": {
            "Accidents": 10
           ,"Death": 10
        }
    }
}]

在这种情况下,我必须编写一个 if 语句来检查父对象是否为空,然后编写另一个 if 语句来检查子对象是否为空,然后再编写另一个 if 语句来检查另一个子语句是否为空。如您所见,编写多个 if 语句来检查 null 可能会很痛苦。

标签: c#

解决方案


对我来说,这看起来不像是非结构化数据集。某些属性为 null 的可能性是可控的(而且太常见),而不是在同一个数组中拥有不同类型的对象而没有任何重叠的属性!

尝试像这样建模您的响应(使用此工具完成):

    public class Traffic {
        public int Accidents { get; set; } 
        public int Death { get; set; } 
    }

    public class Details {
        public int Population { get; set; } 
        public Traffic Traffic { get; set; } 
    }

    public class Response {
        public int ID { get; set; } 
        public string WeatherName { get; set; } 
        public string Location { get; set; } 
        public Details Details { get; set; } 
    }

然后,解析(使用 Newtonsoft.JSON)并以安全的方式访问一些可能为空的属性(为了更安全而编辑,赞 @mjwills):

var response = JsonConvert.DeserializeObject<Response[]>(myJsonString);
int? maybePopulation = response.FirstOrDefault()?.Details?.Population; // either int, or null

换句话说,要处理必须检查 null 并避免编写 null 检查,请使用null-conditional operator


推荐阅读