如何将Json数组转换为c#中的对象列表

时间:2013-10-25 05:33:27

标签: c# json json.net

我有像下面的Json字符串

 {
"JsonValues":{

        "id": "MyID",

         "values": {
            "value1":{
                "id": "100",
                "diaplayName": "MyValue1"
            },
            "value2":{
                "id": "200",
                "diaplayName": "MyValue2"
            }
       }
}
}

我想将Json字符串转换为以下类

  class ValueSet
   {
    [JsonProperty("id")]
    public string id
    {
        get;
        set;
    }
    [JsonProperty("values")]
    public List<Value> values
    {
        get;
        set;
    }
  }

class Value
{
    public string id
    {
        get;
        set;
    }
    public string DiaplayName
    {
        get;
        set;
    }
}

我的反序列化代码是

JavaScriptSerializer js = new JavaScriptSerializer();
        StreamReader sr = new StreamReader(@"ValueSetJsonString.txt");
        string jsonString = sr.ReadToEnd();
        var items = JsonConvert.DeserializeObject<ValueSet>(jsonString);

但序列化后我得到空值,我怎么解决这个问题?

8 个答案:

答案 0 :(得分:15)

正如其他人已经指出的那样,您没有得到预期结果的原因是因为您的JSON与您尝试反序列化的类结构不匹配。您需要更改JSON或更改类。由于其他人已经展示了如何更改JSON,我将采取相反的方法。

要匹配您在问题中发布的JSON,您的类应定义如下。请注意,我做了以下更改:

  1. 我在JSON中添加了与外部对象相对应的Wrapper类。
  2. 我将Values类的ValueSet属性从List<Value>更改为Dictionary<string, Value>,因为JSON中的values属性包含一个对象,而不是一个数组。
  3. 我添加了一些额外的[JsonProperty]属性来匹配JSON对象中的属性名称。
  4. 班级定义:

    class Wrapper
    {
        [JsonProperty("JsonValues")]
        public ValueSet ValueSet { get; set; }
    }
    
    class ValueSet
    {
        [JsonProperty("id")]
        public string Id { get; set; }
        [JsonProperty("values")]
        public Dictionary<string, Value> Values { get; set; }
    }
    
    class Value
    {
        [JsonProperty("id")]
        public string Id { get; set; }
        [JsonProperty("diaplayName")]
        public string DisplayName { get; set; }
    }
    

    您需要反序列化到Wrapper类,而不是ValueSet类。然后,您可以从ValueSet获取Wrapper

    var valueSet = JsonConvert.DeserializeObject<Wrapper>(jsonString).ValueSet;
    

    这是一个展示的工作程序:

    class Program
    {
        static void Main(string[] args)
        {
            string jsonString = @"
            {
                ""JsonValues"": {
                    ""id"": ""MyID"",
                    ""values"": {
                        ""value1"": {
                            ""id"": ""100"",
                            ""diaplayName"": ""MyValue1""
                        },
                        ""value2"": {
                            ""id"": ""200"",
                            ""diaplayName"": ""MyValue2""
                        }
                    }
                }
            }";
    
            var valueSet = JsonConvert.DeserializeObject<Wrapper>(jsonString).ValueSet;
    
            Console.WriteLine("id: " + valueSet.Id);
            foreach (KeyValuePair<string, Value> kvp in valueSet.Values)
            {
                Console.WriteLine(kvp.Key + " id: " + kvp.Value.Id);
                Console.WriteLine(kvp.Key + " name: " + kvp.Value.DisplayName);
            }
        }
    }
    

    这是输出:

    id: MyID
    value1 id: 100
    value1 name: MyValue1
    value2 id: 200
    value2 name: MyValue2
    

答案 1 :(得分:7)

http://json2csharp.com/

我发现上面的链接非常有用,因为它通过从实际返回的JSON生成它们来纠正我的C#类。

然后我打电话给:

JsonConvert.DeserializeObject<RootObject>(jsonString); 

一切都按预期工作。

答案 2 :(得分:2)

您的数据结构和JSON不匹配。

你的JSON是这样的:

{
    "JsonValues":{
        "id": "MyID",
        ...
    }
}

但您尝试将其序列化的数据结构是:

class ValueSet
{
    [JsonProperty("id")]
    public string id
    {
        get;
        set;
    }
    ...
}

您正在跳过一步:您的JSON是一个具有一个名为JsonValues的属性的类,其中ValueSet数据结构的对象为值。

同样在你的班级里面你的JSON是这样的:

"values": { ... }

您的数据结构如下:

[JsonProperty("values")]
public List<Value> values
{
    get;
    set;
}

请注意,JSON中的{ .. }定义了一个对象,其中[ .. ]定义了一个数组。因此,根据您的JSON,您没有一堆值,但是您拥有one个值对象,其属性value1value2类型为Value

由于反序列化程序需要一个数组但却得到一个对象,它可以做的事情是做到最少的非破坏性(Exception):跳过该值。您的媒体资源values仍保留默认值:null

如果可以:调整您的JSON。以下内容符合您的数据结构,很可能是您真正想要的:

{
    "id": "MyID",

     "values": [
         {
            "id": "100",
            "diaplayName": "MyValue1"
         }, {
            "id": "200",
            "diaplayName": "MyValue2"
         }
     ]
}

答案 3 :(得分:1)

你检查这条线是否完美无缺;你的字符串有价值吗?

string jsonString = sr.ReadToEnd();

如果是,请在最后一行尝试此代码:

ValueSet items = JsonConvert.DeserializeObject<ValueSet>(jsonString);

或者如果你有一个json数组,你可以使用这样的列表:

List<ValueSet> items = JsonConvert.DeserializeObject<List<ValueSet>>(jsonString);

祝你好运

答案 4 :(得分:0)

你有一个不匹配的jSon字符串,如果你想转换成一个列表,试试这个

{
    "id": "MyID",

     "values": [
        {
            "id": "100",
            "diaplayName": "MyValue1",
        },
        {
            "id": "200",
            "diaplayName": "MyValue2",
        }
   ]    
}

答案 5 :(得分:0)

这也是可能的:

   using System.Web.Helpers;
   var listOfObjectsResult = Json.Decode<List<DataType>>(JsonData);

答案 6 :(得分:0)

Json转换为C#类= https://json2csharp.com/json-to-csharp

架构出现后

.exe

我们最大的错误之一是我们无法将类结构与json匹配。

此连接将自动执行该过程。您稍后将进行编码;)= https://json2csharp.com/json-to-csharp

就是这样。

答案 7 :(得分:-4)

您可以使用Json.Net框架来执行此操作。 就像这样:

Account account = JsonConvert.DeserializeObject<Account>(json);

主页:http://json.codeplex.com/

关于此的文件:http://james.newtonking.com/json/help/index.html#