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

nik*_*owj 12 c# json json.net

我有Json字符串,如下所示

 {
"JsonValues":{

        "id": "MyID",

         "values": {
            "value1":{
                "id": "100",
                "diaplayName": "MyValue1"
            },
            "value2":{
                "id": "200",
                "diaplayName": "MyValue2"
            }
       }
}
}
Run Code Online (Sandbox Code Playgroud)

我想将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;
    }
}
Run Code Online (Sandbox Code Playgroud)

我的反序列化代码是

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

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

Bri*_*ers 16

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

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

  1. Wrapper在JSON中添加了一个与外部对象相对应的类.
  2. ValuesValueSet类的属性从a List<Value>更改为a,Dictionary<string, Value>因为valuesJSON中的属性包含对象,而不是数组.
  3. 我添加了一些额外的[JsonProperty]属性来匹配JSON对象中的属性名称.

类定义:

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; }
}
Run Code Online (Sandbox Code Playgroud)

您需要反序列化到Wrapper类中,而不是ValueSet类.然后,您可以得到ValueSetWrapper.

var valueSet = JsonConvert.DeserializeObject<Wrapper>(jsonString).ValueSet;
Run Code Online (Sandbox Code Playgroud)

这是一个工作程序来演示:

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);
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

这是输出:

id: MyID
value1 id: 100
value1 name: MyValue1
value2 id: 200
value2 name: MyValue2
Run Code Online (Sandbox Code Playgroud)


bul*_*ous 7

http://json2csharp.com/

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

然后我打电话给:

JsonConvert.DeserializeObject<RootObject>(jsonString); 
Run Code Online (Sandbox Code Playgroud)

一切都按预期工作.


M2s*_*2sh 6

您是否检查过这条线是否完美运行并且您的字符串具有价值?

string jsonString = sr.ReadToEnd();

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

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

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

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

祝你好运