【发布时间】:2018-02-14 01:18:26
【问题描述】:
我正在访问一个返回类似 JSON 的响应的 Web 服务,并且我正在尝试反序列化对 C# 对象的响应。我使用 Visual Studio Edit > Paste Special > Paste JSON as Classes 方法来创建类的基本版本。当我尝试使用以下方法反序列化对这些类的 Web 服务响应时(其中 rawResp 是来自 Web 服务的文本响应)
var results = JsonConvert.DeserializeObject<List<ApplyEditsResult>>(rawResp);
我收到以下错误消息:
无法反序列化当前 JSON 对象(例如 {"name":"value"}) 进入类型“Rid20Api.Models.ApplyEditsResult+Result”,因为类型 需要一个 JSON 数组(例如 [1,2,3])才能正确反序列化。修理 此错误将 JSON 更改为 JSON 数组(例如 [1,2,3])或 更改反序列化类型,使其成为普通的 .NET 类型(例如 不是像整数这样的原始类型,不是像数组这样的集合类型 或列表)可以从 JSON 对象反序列化。 JsonObjectAttribute 也可以添加到类型中以强制它 从 JSON 对象反序列化。路径'[0].addResults[0].objectId', 第 1 行,位置 35。
我尝试将“JsonObject”属性添加到适当的类;添加了 JsonArray 属性也是如此。我缺少什么来正确反序列化响应?
来自网络服务的响应:
[
{
"id": 0,
"addResults": [
{
"objectId": 1215,
"globalId": "{5a3d5c49-856c-4de4-9d20-c7abf0e070c8}",
"success": true
}
],
"attachments": {
"addResults": [],
"deleteResults": [],
"updateResults": []
}
},
{
"id": 2,
"addResults": [
{
"objectId": 819,
"globalId": "{459f456a-c115-4f9c-b1f9-d754d55980dd}",
"success": true
},
{
"objectId": 820,
"globalId": "{f690cded-2ffb-4301-ab6e-58ae9733eeba}",
"success": true
}
]
}
]
和类(无论类是嵌套的还是“独立的”,都没有任何区别):
public class ApplyEditsResult
{
public int id { get; set; }
public Result[] addResults { get; set; }
public Result[] updateResults { get; set; }
public Result[] attachments { get; set; }
[JsonObject]
public class Attachments
{
[JsonProperty("addResults")]
public object[] addResults { get; set; }
[JsonProperty("deleteResults")]
public object[] deleteResults { get; set; }
[JsonProperty("updateResults")]
public object[] updateResults { get; set; }
}
[JsonArray(AllowNullItems = true)]
[JsonObject]
public class Result
{
public bool success { get; set; }
public Error error { get; set; }
public int objectId { get; set; }
public string globalId { get; set; }
}
[JsonObject]
public class Error
{
public int code { get; set; }
public string description { get; set; }
}
}
编辑...... 这是 VS 工具创建的未经编辑的类集合。如上所述以及在下面的 cmets 中,我更改了其中一些类 1) 以更好地适应我的代码(包括来自服务的错误响应)和 2) 尝试自己纠正错误(失败)。
public class Rootobject
{
public Class1[] Property1 { get; set; }
}
public class Class1
{
public int id { get; set; }
public Addresult[] addResults { get; set; }
public Attachments attachments { get; set; }
}
public class Attachments
{
public object[] addResults { get; set; }
public object[] deleteResults { get; set; }
public object[] updateResults { get; set; }
}
public class Addresult
{
public int objectId { get; set; }
public string globalId { get; set; }
public bool success { get; set; }
}
【问题讨论】:
-
你不需要在
Result类之上的[JsonArray(AllowNullItems = true)]。 -
公共结果[] addResults { get;放; } 公共结果 [] 更新结果 { 获取;放; } 公共结果 [] 附件 { 获取;放; } 所有对象具有相同的返回类型。它不会解析。 Json 架构应该类似于类层次结构
-
VS 没有创建这些类 - 您缺少应该包含 AddResult 列表、附件对象和 int 的 RootObject
-
@Plutonix - 我确实使用 VS 来创建类。我删除了“RootObject”,因为来自 Web 服务的响应没有 JSON 的“根”(相反,它只返回一个数组)。我的错误是将“AddResult”类的名称更改为“Result”。试图将该类用作添加、删除和更新的通用“结果”。这并不顺利。
-
ApplyEditsResult是根对象。没有一个机器人工具将相关类型作为嵌套类。
标签: c# json json.net deserialization