使用JSON.NET从URL反序列化JSON数组

4
我第一次使用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<Machine> machines = JsonConvert.DeserializeObject<List<Machine>>(json);进行反序列化。稍后您可以迭代该列表以访问各个 Machine 对象。 - CS.
3个回答

4
将其转换为一个 Machine 列表。
var machine = JsonConvert.DeserializeObject<List<Machine>>(json);

要访问数据,请在机器上运行foreach。
foreach(var data in machine ) 
{ 
     Console.WriteLine(data.id); 
}

但是这样我无法像在类中那样访问该信息。 - user5987027

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

如果我使用列表,如何访问列表以获取其不同部分? - user5987027
你可以使用 ForEach 循环,类似这样:foreach(var machine in machines) { Console.WriteLine(machine.id); } - Saadi

0

使用装饰器装饰您的模型

[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;} ",这不是错误的吗? - user5987027

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接