0

我在 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 多个项目。正在从数据库中提取此数据。

4

2 回答 2

0

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

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 Root
{
    public List<Detail> details { get; set; }
}

public class Program 
{
    static void Main(string[] args) 
    { 
        string txt = File.ReadAllText("MyJSONFile.txt"); 
        JavaScriptSerializer ser = new JavaScriptSerializer(); 
        var data = ser.Deserialize<Root>(txt); 

        Console.WriteLine(data.details.Count); // 3
        Console.WriteLine(data.details[0].state); // myState1
        Console.WriteLine(data.details[1].place.Count); // 1
        Console.WriteLine(data.details[1].place[0].age); // 13
    }
}
于 2015-10-27T04:53:25.553 回答
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);
}
于 2015-10-27T07:46:11.807 回答