使用来自 URL 的 JSON.NET 反序列化 JSON 数组
Posted
技术标签:
【中文标题】使用来自 URL 的 JSON.NET 反序列化 JSON 数组【英文标题】:Deserialize JSON Array with JSON.NET from URL 【发布时间】: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<Machine> machines = JsonConvert.DeserializeObject<List<Machine>>(json);
。您可以稍后迭代列表以访问各个 Machine
对象。
【参考方案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;”是不是错了?以上是关于使用来自 URL 的 JSON.NET 反序列化 JSON 数组的主要内容,如果未能解决你的问题,请参考以下文章
使用 json.net 反序列化没有类型信息的多态 json 类