我正在点击一个返回类似JSON的响应的Web服务,我正在尝试反序列化对C#对象的响应。我看了Visual Studio Edit>选择性粘贴>将JSON粘贴为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类型(例如 不是像整数这样的原始类型,不是像数组那样的集合类型 或者List)可以从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工具创建的未编辑的类集合。如上所述,在下面的评论中,我改变了其中一些类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; }
}
答案 0 :(得分:1)
你的课应该是这样的
public class AddResult
{
[JsonProperty("objectId")]
public int objectId { get; set; }
[JsonProperty("globalId")]
public string globalId { get; set; }
[JsonProperty("success")]
public bool success { get; set; }
}
public class Attachments
{
[JsonProperty("addResults")]
public List<object> addResults { get; set; }
[JsonProperty("deleteResults")]
public List<object> deleteResults { get; set; }
[JsonProperty("updateResults")]
public List<object> updateResults { get; set; }
}
public class ApplyEditsResult
{
[JsonProperty("id")]
public int id { get; set; }
[JsonProperty("addResults")]
public List<AddResult> addResults { get; set; }
[JsonProperty("attachments")]
public Attachments attachments { get; set; }
}
然后
var results = JsonConvert.DeserializeObject<List<ApplyEditsResult>>(rawResp);