【问题标题】:Deserializing JSON with json.net使用 json.net 反序列化 JSON
【发布时间】:2016-08-18 15:38:15
【问题描述】:

我正在尝试使用 JSON.Net 将以下 JSON 文本反序列化为 C# 类。

{
"jsonrpc": "2.0",
"result": [{
    "groupid": "5",
    "name": "Discovered hosts",
    "internal": "1",
    "flags": "0"
}, {
    "groupid": "7",
    "name": "Hypervisors",
    "internal": "0",
    "flags": "0"
}, {
    "groupid": "2",
    "name": "Linux servers",
    "internal": "0",
    "flags": "0"
}, {
    "groupid": "8",
    "name": "Network Gear",
    "internal": "0",
    "flags": "0"
}, {
    "groupid": "1",
    "name": "Templates",
    "internal": "0",
    "flags": "0"
}, {
    "groupid": "6",
    "name": "Virtual machines",
    "internal": "0",
    "flags": "0"
}, {
    "groupid": "4",
    "name": "Zabbix servers",
    "internal": "0",
    "flags": "0"
}],
"id": 2

}

类如下:

    public class getHostsResponse
    {
        public string jsonrpc { get; set; }
        public List<getHostsRecord> hostlist { get; set; }
        public int id { get; set; }
    }

    public class getHostsRecord
    {
        public string groupid { get; set; }
        public string name { get; set; }
        public string internala { get; set; }
        public string flags { get; set; }
    }

反序列化语句为:

getHostsResponse response2 = JsonConvert.DeserializeObject<getHostsResponse>(response);

jsonrpc和id字段反序列化正确,但是hostlist字段为空。

我的类(特别是 gethostrecords)是否设置不正确以接收反序列化流?

谢谢。

布莱恩·亨特

【问题讨论】:

    标签: json.net


    【解决方案1】:

    是的,您的类中的属性名称需要与 JSON 匹配(否则您需要在每个属性上使用 [JsonProperty] 属性来指示它们不同的 JSON 名称)。

    getHostsResponse 类中的hostlist 属性的名称更改为result,它应该会开始工作。您还将getHostsRecord 中的internal 属性拼错为internala

    修改后的类如下:

    public class getHostsResponse
    {
        public string jsonrpc { get; set; }
        public List<getHostsRecord> result { get; set; }
        public int id { get; set; }
    }
    
    public class getHostsRecord
    {
        public string groupid { get; set; }
        public string name { get; set; }
        public string internal { get; set; }
        public string flags { get; set; }
    }
    

    或者,使用[JsonProperty] 方法:

    public class getHostsResponse
    {
        public string jsonrpc { get; set; }
        [JsonProperty("result")]
        public List<getHostsRecord> hostlist { get; set; }
        public int id { get; set; }
    }
    
    public class getHostsRecord
    {
        public string groupid { get; set; }
        public string name { get; set; }
        public string internal { get; set; }
        public string flags { get; set; }
    }
    

    【讨论】:

    • 啊。就是这样。我匹配了所有元素名称,但没有意识到我也需要为数组名称这样做。感谢您指出布赖恩。
    • 不用担心;很高兴我能帮上忙。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-11-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多