c#循环遍历json数据

时间:2017-04-22 07:58:20

标签: c# visual-studio-2005

我有一个像这样的json:

[{ "Demand": 4422.45, "Supply": 17660, "Date": "/Date(1236504600000)/", "DateString": "3 PM" },  
{ "Demand": 4622.88, "Supply": 7794, "Date": "/Date(1236522600000)/", "DateString": "8 PM" }, 
{ "Demand": 545.65, "Supply": 2767, "Date": "/Date(1236583800000)/", "DateString": "1 PM" }, 
{ "Demand": 0, "Supply": 1, "Date": "/Date(1236587400000)/", "DateString": "2 PM" }];

如何在vs2005 c#中循环浏览每个项目?请不要建议newtonsoft反序列化,因为它在我的vs2005解决方案中不起作用。我也不能使用" var" vs2005中的关键字。

感谢。

2 个答案:

答案 0 :(得分:3)

您可以使用属于System.Runtime.Serialization程序集的DataContractJsonSerializer类。首先编写一个代表该实体的模型:

public class MyModel
{
    public decimal Demand { get; set; }
    public decimal Supply { get; set; }
    public DateTime Date { get; set; }
    public string DateString { get; set; }
}

然后将JSON字符串反序列化为此模型的列表:

string json = "[{ \"Demand\": 4422.45, \"Supply\": 17660, \"Date\": \"/Date(1236504600000)/\", \"DateString\": \"3 PM\" },  { \"Demand\": 4622.88, \"Supply\": 7794, \"Date\": \"/Date(1236522600000)/\", \"DateString\": \"8 PM\" }, { \"Demand\": 545.65, \"Supply\": 2767, \"Date\": \"/Date(1236583800000)/\", \"DateString\": \"1 PM\" }, { \"Demand\": 0, \"Supply\": 1, \"Date\": \"/Date(1236587400000)/\", \"DateString\": \"2 PM\" }]";
DataContractJsonSerializer serializer = new DataContractJsonSerializer(typeof(List<MyModel>));
using (Stream stream = new MemoryStream(Encoding.UTF8.GetBytes(json)))
{
    List<MyModel> models = (List<MyModel>)serializer.ReadObject(stream);
    foreach (MyModel model in models)
    {
        // do something with the model here
        Console.WriteLine(model.Date);
    }
}

更新:

看起来你正在使用一些不支持自动属性的史前版本的C#。在这种情况下,每个属性都需要一个私有字段:

public class MyModel
{
    private decimal demand;
    public decimal Demand 
    { 
        get { return this.demand; }
        set { this.demand = value; }
    }

    private decimal supply;
    public decimal Supply 
    { 
        get { return this.supply; }
        set { this.supply = value; }
    }

    private DateTime date;
    public DateTime Date
    { 
        get { return this.date; }
        set { this.supply = value; }
    }

    private string dateString;
    public string DateString
    { 
        get { return this.dateString; }
        set { this.dateString = value; }
    }
}

答案 1 :(得分:1)

使用JavaScriptSerializer的另一种方法是System.Web.Extensions程序集的一部分。

您需要一个代表您的数据的模型:

public class Data
{
    public decimal Demand { get; set; }
    public int Supply { get; set; }
    public DateTime Date { get; set; }
    public string DateString { get; set; }
}

然后你需要这个:

string json = "[{\"Demand\": 4422.45,\"Supply\": 17660,\"Date\":\"\\/Date(1236504600000)\\/\",\"DateString\":\"3 PM\" },{\"Demand\": 4622.88, \"Supply\": 7794, \"Date\": \"\\/Date(1236522600000)\\/\", \"DateString\": \"8 PM\" }]";
JavaScriptSerializer serializer = new JavaScriptSerializer();
List<Data> result = serializer.Deserialize<List<Data>>(json);

注意:请注意json中的Date属性。我添加了一些额外的字符:\"\\/Date(1236504600000)\\/\"。不幸的是,DataContractJsonSerializerJavaScriptSerializer都无法反序列化&#34; /日期(1236504600000)/&#34;,您需要默认这些额外的字符。如果你是这个json的生产者和使用者,那么你可以很容易地在客户端处理这个问题,如here所述。否则,在对客户端发送给您的json进行反序列化之前,应该遵循服务器端的一些类似方法。