[asp.net]json newtonsoft︰ 反序列化对象,包含的字符串列表

标签: Asp.net .Net C#
发布时间: 2017/3/26 0:21:59
注意事项: 本文中文内容可能为机器翻译,如要查看英文原文请点击上面连接.

我有这个 json 的以下问题︰

{
"EVTS": {
"EVT": [
  { "ID": "123456",
    "KEY1" : "somekey",
    "CATEG": [
      "cat1",
      "cat2",
      "cat3"
    ]
  }
  ]}
  }

与此 c# 类︰

public class myClass{
    public string ID { get; set; }
    public string KEY1 { get; set; } 

    public list<string> CATEG { get; set; } 
}

public class ESObject1
{

    [JsonProperty("EVT")]
    public List<myClass> EVT { get; set; }
}

public class ESObject0
{

    [JsonProperty("EVTS")]
    public ESObject1 EVTS { get; set; }
}

}

在这里呼吁反序列化程序︰

ESObject0 globalobject = JsonConvert.DeserializeObject<ESObject0>(json);

但这最后的代码不工作,我会引发此异常︰ System.ArgumentException: Could not cast or convert from System.String to System.Collections.Generic.List 1[System.String].'

而不是 list<string> 我用 string [] 和只有 string 似乎没有什么工作。

怎么可以我反序列化该对象正确请。

谢谢。

解决方法 1:

似乎是任何明显问题机智 hyour 代码,如这工作示例所示︰

using Newtonsoft.Json;
using System;
using System.Collections.Generic;

public class myClass
{
    public string ID { get; set; }
    public string KEY1 { get; set; } 
    public List<string> CATEG { get; set; } 
}

public class ESObject1
{
    [JsonProperty("EVT")]
    public List<myClass> EVT { get; set; }
}

public class ESObject0
{
    [JsonProperty("EVTS")]
    public ESObject1 EVTS { get; set; }
}


class Program
{
    static void Main()
    {
        string json = 
        @"{
            ""EVTS"": {
                ""EVT"": [
                    {
                        ""ID"": ""123456"",
                        ""KEY1"": ""somekey"",
                        ""CATEG"": [
                            ""cat1"",
                            ""cat2"",
                            ""cat3""
                        ]
                    }
                ]
            }
        }";

        ESObject0 globalobject = JsonConvert.DeserializeObject<ESObject0>(json);
        foreach (string item in globalobject.EVTS.EVT[0].CATEG)
        {
            Console.WriteLine(item);
        }
    }
}

也许你只是美联储的错 json 到反序列化程序,不会看起来像是你的问题中所示的值。顺便问一下,所示我委托你问题是无效的 JSON 你缺少 ,KEY1 属性声明。


更新︰

现在,你表现出你的真实 JSON (来自http://donnees.ville.quebec.qc.ca/Handler.ashx?id=69&f=JSON) 似乎是一排在哪里 CATEG 不是字符串,但一个简单的字符串的数组︰

""CATEG"": ""Conférence""

现在那是个非常糟糕的设计,因为他们混合阵列和简单的属性。我恐怕,你应对这种情况时,将需要使用 JObject s 和提取所需的测试实际基础类型信息。

例如︰

var obj = JObject.Parse(json);
var events = (JArray)obj["EVTS"]["EVT"];
foreach (JObject evt in events)
{
    var categories = evt["CATEG"];
    if (categories is JArray)
    {
        // you've got a list of strings so you can loop through them
        string[] cats = ((JArray)categories)
            .Select(x => x.Value<string>())
            .ToArray();
    }
    else
    {
        // you've got a simple string
        string cat = categories.Value<string>();
    }
}
赞助商