【问题标题】:Deserialize JSON Array with JSON.NET from URL使用来自 URL 的 JSON.NET 反序列化 JSON 数组
【发布时间】:2016-10-06 22:42:45
【问题描述】:

我是第一次使用 json,在互联网上搜索后,我找到了 JSON.NET。我认为它很容易使用,但我有一个问题。每次我使用代码时都会收到警告:

无法将当前 JSON 数组(例如 [1,2,3])反序列化为类型“JSON_WEB_API.Machine”,因为该类型需要 JSON 对象(例如 {"name":"value"})才能正确反序列化。

这是来自 URL 的 JSON 数组:

[
   {
      "id": "MachineTool 1",
      "guid": "not implemented",
      "name": "Individueller Maschinenname",
    },
    {
      "id": "MachineTool 2",
      "guid": "not implemented",
      "name": "Individueller Maschinenname",
    }
]

这是代码:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Net;
using System.Runtime.Serialization;
using Newtonsoft.Json;

namespace JSON_WEB_API
{
class Program
{
    static void Main()
    {
        string json = new WebClient().DownloadString("http://localhost:12084/Machines?format=json");
        Console.WriteLine(json);

        //string json = @"[{"id":"MachineTool 1","guid":"not implemented","name":"Individueller Maschinenname"},{"id":"MachineTool 2","guid":"not implemented","name":"Individueller Maschinenname"}]
        //Console.WriteLine(json)";

        Machine machine = JsonConvert.DeserializeObject<Machine>(json);
        Console.WriteLine(machine.id);

        Console.Read();
    }
}
[DataContract]
class Machine
{
    [DataMember]
    internal string id { get; set; }

    [DataMember]
    internal string guid { get; set; }

    [DataMember]
    internal string name { get; set; }
}

}

【问题讨论】:

  • 试试List&lt;Machine&gt; machines = JsonConvert.DeserializeObject&lt;List&lt;Machine&gt;&gt;(json);。您可以稍后迭代列表以访问各个 Machine 对象。

标签: c# arrays json json-deserialization


【解决方案1】:

将其转换为机器列表

var machine = JsonConvert.DeserializeObject<List<Machine>>(json);

要访问数据,请在机器上运行 foreach。

foreach(var data in machine ) 
{ 
     Console.WriteLine(data.id); 
}

【讨论】:

  • 但我无法像在课堂上那样访问信息
【解决方案2】:

查看您的 JSON:

[
   {
      "id": "MachineTool 1",
      "guid": "not implemented",
      "name": "Individueller Maschinenname",
    },
    {
      "id": "MachineTool 2",
      "guid": "not implemented",
      "name": "Individueller Maschinenname",
    }
]

这是一个 JSON 数组。

并查看您的 JSON 转换代码:

Machine machine = JsonConvert.DeserializeObject<Machine>(json);

您正在将其转换为 Machine 对象。

但是你有 json 数组作为响应。 您需要将您的 JSON 转换代码更改为:

要将其转换为数组,请使用以下代码:

Machine[] machines =  JsonConvert.DeserializeObject.Deserialize<Machine[]>(json);

要在列表中转换它,请使用以下代码:

List<Machine> machines = JsonConvert.DeserializeObject<List<Machine>>(json);

【讨论】:

  • 如果我使用列表,我如何访问列表以获取它的不同部分?
  • 您可以使用 ForEach 循环。类似的东西:foreach(var machine in machines) { Console.WriteLine(machine.id); }
【解决方案3】:

装饰你的模型
[DataContract]
class Machine
{
    [DataMember]
    [JsonProperty("id ")]
    internal string id { get; set; }

    [DataMember]
    [JsonProperty("guid ")]
    internal string guid { get; set; }

    [DataMember]
    [JsonProperty("name")]
    internal string name { get; set; }
}


public class MachineJson
{
    [JsonProperty("machine")]
    public Machine Machine{ get; set; }
}

var machine = JsonConvert.DeserializeObject<List<MachineJson>>(json);

【讨论】:

  • 在MachineJson类中你为什么写“Machine Machine {get; set;}”是不是错了?
猜你喜欢
  • 1970-01-01
  • 2013-08-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多