我有一个像这样的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中的关键字。
感谢。
答案 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)\\/\"
。不幸的是,DataContractJsonSerializer
和JavaScriptSerializer
都无法反序列化&#34; /日期(1236504600000)/&#34;,您需要默认这些额外的字符。如果你是这个json的生产者和使用者,那么你可以很容易地在客户端处理这个问题,如here所述。否则,在对客户端发送给您的json进行反序列化之前,应该遵循服务器端的一些类似方法。