2012-05-21 3 views
0

Я столкнулся с проблемой для разбора массив JSON в C#Чтение данных из словаря

{ 
    "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 будет включать только данные одного объекта, но в других случаях в массиве содержится более 30 элементов. Эти данные извлекаются из базы данных.

+0

общественного класса Wrap { общественного List > подробности {get; задавать; } } – Hope

+2

проверить это [ссылка] (http://www.drowningintechnicaldebt.com/ShawnWeisfeld/archive/2010/08/22/using-c-4.0-and-dynamic-to-parse-json.aspx) или это [link] (http://stackoverflow.com/questions/3142495/deserialize-json-into-c-sharp-dynamic-object/3806407#3806407) – Darshana

+0

Я предлагаю вам использовать [Newtonsoft.Json] (https://www.nuget.org/packages/Newtonsoft.Json/) и для генерации необходимых классов вы можете использовать [Json2CSharp] (http://json2csharp.com/) –

ответ

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 
    } 
} 
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); 
} 
Смежные вопросы