【问题标题】:c# loop through json datac# 循环遍历json数据
【发布时间】:2017-04-22 07:58:19
【问题描述】:

我有一个这样的 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 解决方案中不起作用。我也不能在 vs2005 中使用“var”关键字。

谢谢。

【问题讨论】:

  • 你可能知道你应该根据你从你的 json 创建的模型反序列化它然后你有一个该模型的列表然后你可以遍历列表

标签: c# visual-studio-2005


【解决方案1】:

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

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; }
    }
}

【讨论】:

  • 感谢达林的回复。我收到错误 - Supply.get' 必须声明一个主体,因为它没有标记为抽象或外部 - 你知道它为什么会出现吗?
  • 看来您使用的是一些非常旧的 C# 版本,它不支持自动属性。在这种情况下,您需要为每个属性设置一个私有字段:private decimal demand; public Decimal Demand { get { return this.demand; } set { this.demand = value; } }。其他属性以此类推。我会用一个例子来更新我的答案。
  • Darin - 你知道我可以使用什么来代替 var,因为它会出错 - 找不到类型或命名空间名称“var”(你是否缺少 using 指令或程序集引用?)
  • 我得到的另一个错误是 - 'System.Runtime.Serialization.XmlObjectSerializer.ReadObject(System.IO.Stream)' 的最佳重载方法匹配有一些无效参数
  • XmlObjectSerializer?这是从哪里来的?您使用的是哪个版本的 .NET 框架?我不确定 DataContractJsonSerializer 类在旧版本中是否可用。
【解决方案2】:

另一种方法是使用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 都不能反序列化“/Date(1236504600000)/”,你肯定需要这些额外的字符。如果你是这个 json 的生产者和消费者,那么你可以很容易地在客户端处理它,正如 here 所描述的那样。否则,在反序列化客户端发送给您的 json 之前,应在服务器端遵循一些类似的方法。

【讨论】:

  • 克里斯托斯 - 谢谢你的回复。我收到错误 - 找不到类型或命名空间名称“var”(您是否缺少 using 指令或程序集引用?)。我该如何解决这个问题?
  • @user1254053 我的错...对不起..我忘了你不能使用var关键字。
  • 现在它构建成功但在浏览器上给出了这一行的错误 List result = serializer.Deserialize>(json); - 无效的 JSON 原语:http.
  • @user1254053 你查看通知了吗?您拥有的 json 是否与答案之一具有相同的格式?注意日期。可能是这种情况。 JavaScriptSerializerDataContractJsonSerializer 都无法解析您拥有的 json?需要做一些额外的工作。
  • 我已经修改并制作了简单的 json - class MyData { public string Name;公共日期时间到期日期;公众持股价格;公共字符串[][] 大小; }
    string json = "{\"Name\": \"Apple\", \"ExpiryDate\": \"2008-12-28T00:00:00\", \"Price\": 3.99, \"尺寸\": [ \"小号\", \"中号\", \"大号\" ]}"; JavaScriptSerializer 序列化器 = new JavaScriptSerializer(); List 结果 = serializer.Deserialize>(json);
猜你喜欢
  • 2017-01-30
  • 1970-01-01
  • 2019-12-18
  • 1970-01-01
  • 2013-02-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多