从Dictionary中读取数据

时间:2012-05-21 10:23:24

标签: c# json

我在C#

中解析JSON数组时遇到问题
{
    "details" : [{
            "state" : "myState1",
            "place" : [{
                    "name" : "placeName",
                    "age" : 13
                }
            ]
        }, {
            "state" : "myState2",
            "place" : [{
                    "name1" : "placeName"
                }
            ]
        }, {
            "state" : "myState3",
            "place" : [{
                    "name2" : "placeName"
                }
            ]
        }
    ]
}

我的代码是:

static void Main(string[] args) 
{ 
    string txt = File.ReadAllText("MyJSONFile.txt"); 
    JavaScriptSerializer ser = new JavaScriptSerializer(); 
    var data = ser.Deserialize(txt); 
}

public class Wrap
{ 
    public List<Dictionary<string, object>> details { get; set; } 
}

如何从这些词典中读取数据?有时JSON只包含1个工具的详细信息,但有时候数组中有30个以上的项目。这些数据正从数据库中提取。

2 个答案:

答案 0 :(得分:0)

您可以使用以下C#类结构:

C++ Primer

答案 1 :(得分:0)

您使用的类结构是错误的。 您将必须使用如下结构,该结构对应于您的JSON。 已使用json2csharp

生成此结构
public class Place
{
    public string name { get; set; }
    public int age { get; set; }
    public string name1 { get; set; }
    public string name2 { get; set; }
}

public class Detail
{
    public string state { get; set; }
    public List<Place> place { get; set; }
}

public class RootObject
{
    public List<Detail> details { get; set; }
}

现在在您的代码中,您可以使用Newtonsoft.Json对其进行序列化,如下所示:

static void Main(string[] args)
{
     string jsonText = System.IO.File.ReadAllText("MyJSONFile.txt");
     var rootObj = Newtonsoft.Json.JsonConvert.DeserializeObject<RootObject>(jsonText);
     rootObj.details.ForEach(detail =>
     {
         Console.WriteLine(detail.state);
         detail.place.ForEach(p =>
         {
             if (string.IsNullOrWhiteSpace(p.name) == false)
             {
                  Console.WriteLine(p.name);
             }
             if (string.IsNullOrWhiteSpace(p.name1) == false)
             {
                  Console.WriteLine(p.name1);
             }
             if (string.IsNullOrWhiteSpace(p.name2) == false)
             {
                  Console.WriteLine(p.name2);
             }
             if (p.age > 0)
             {
                  Console.WriteLine(p.age);
             }
             Console.WriteLine(string.Empty);
         });
     });
     Console.ReadKey(true);
}