JSON 当嵌套对象为空时反序列化抛出异常
JSON deserialization throws exception when nested object is empty
您好,我在将 JSON 反序列化为对象时遇到问题。
我有这种JSON:
{
"my_obj":{
"id":"test",
"nested_obj":{
"value":"testValue",
"desc":"testDesc"}
}
}
但有时我会收到空的 nested_obj:
{
"my_obj":{
"id":"test",
"nested_obj":""
}
}
我的代码来处理这个:
public class MyObj
{
public string id { get; set; }
public NestedObj nested_obj { get; set; }
}
public class NestedObj
{
public string value { get; set; }
public string desc { get; set; }
}
public virtual T Execute<T>(IRestRequest request) where T : new()
{
request.RequestFormat = DataFormat.Json;
var response = _client.Execute<T>(request);
LogResponse(response);
CheckResponseException(response);
return response.Data;
}
当 nested_obj 不为空时,反序列化工作得很好。但是当 nested_obj 为空时,我收到此异常:
Unable to cast object of type 'System.String' to type 'System.Collections.Generic.IDictionary`2[System.String,System.Object]'.
可以这样反序列化吗?不幸的是,无法更改 WebService 的响应,因此我应该在我的应用程序中正确解析它。
原因是因为在
{
"my_obj":{
"id":"test",
"nested_obj":{
"value":"testValue",
"desc":"testDesc"}
}
}
嵌套对象正在接收对象类型
同时在
{
"my_obj":{
"id":"test",
"nested_obj":""
}
}
正在接收字符串类型
如果
它returns
{
"my_obj":{
"id":"test",
"nested_obj":null
}
}
那么就可以解析成功了
尝试使用 http://json2csharp.com/ 转换您的两个 json 并查看差异
只需使用 Newtonsoft 的 Json.NET。它工作正常。这是 LINQPad 的一小段代码:
void Main()
{
JsonConvert.DeserializeObject<A>(@"{
property: ""apweiojfwoeif"",
nested: {
prop1: ""wpeifwjefoiwj"",
prop2: ""9ghps89e4aupw3r""
}
}").Dump();
JsonConvert.DeserializeObject<A>(@"{
property: ""apweiojfwoeif"",
nested: """"
}").Dump();
}
// Define other methods and classes here
class A {
public string Property {get;set;}
public B Nested {get;set;}
}
class B {
public string Prop1 {get;set;}
public string Prop2 {get;set;}
}
结果是
哎呀。正如您所知,这与您的代码无关。只是 Web 服务有时将 nested_obj 定义为 NestedObj 对象,有时定义为字符串(当它发送 null 时)。所以你的解析器不知道该怎么做。
最好的办法可能是为它编写自定义解析器。 (这是有道理的,因为它不是标准的 JSON 由于类型变形)。
有一节是关于为 RestSharp 编写自定义解析器的here
他们告诉你实现 IDeserializer
,但我建议你简单地扩展 JsonDeserializer
以添加你的特殊自定义功能,然后将其他一切委托给超级 class。
您好,我在将 JSON 反序列化为对象时遇到问题。
我有这种JSON:
{
"my_obj":{
"id":"test",
"nested_obj":{
"value":"testValue",
"desc":"testDesc"}
}
}
但有时我会收到空的 nested_obj:
{
"my_obj":{
"id":"test",
"nested_obj":""
}
}
我的代码来处理这个:
public class MyObj
{
public string id { get; set; }
public NestedObj nested_obj { get; set; }
}
public class NestedObj
{
public string value { get; set; }
public string desc { get; set; }
}
public virtual T Execute<T>(IRestRequest request) where T : new()
{
request.RequestFormat = DataFormat.Json;
var response = _client.Execute<T>(request);
LogResponse(response);
CheckResponseException(response);
return response.Data;
}
当 nested_obj 不为空时,反序列化工作得很好。但是当 nested_obj 为空时,我收到此异常:
Unable to cast object of type 'System.String' to type 'System.Collections.Generic.IDictionary`2[System.String,System.Object]'.
可以这样反序列化吗?不幸的是,无法更改 WebService 的响应,因此我应该在我的应用程序中正确解析它。
原因是因为在
{
"my_obj":{
"id":"test",
"nested_obj":{
"value":"testValue",
"desc":"testDesc"}
}
}
嵌套对象正在接收对象类型
同时在
{
"my_obj":{
"id":"test",
"nested_obj":""
}
}
正在接收字符串类型
如果
它returns
{
"my_obj":{
"id":"test",
"nested_obj":null
}
}
那么就可以解析成功了
尝试使用 http://json2csharp.com/ 转换您的两个 json 并查看差异
只需使用 Newtonsoft 的 Json.NET。它工作正常。这是 LINQPad 的一小段代码:
void Main()
{
JsonConvert.DeserializeObject<A>(@"{
property: ""apweiojfwoeif"",
nested: {
prop1: ""wpeifwjefoiwj"",
prop2: ""9ghps89e4aupw3r""
}
}").Dump();
JsonConvert.DeserializeObject<A>(@"{
property: ""apweiojfwoeif"",
nested: """"
}").Dump();
}
// Define other methods and classes here
class A {
public string Property {get;set;}
public B Nested {get;set;}
}
class B {
public string Prop1 {get;set;}
public string Prop2 {get;set;}
}
结果是
哎呀。正如您所知,这与您的代码无关。只是 Web 服务有时将 nested_obj 定义为 NestedObj 对象,有时定义为字符串(当它发送 null 时)。所以你的解析器不知道该怎么做。
最好的办法可能是为它编写自定义解析器。 (这是有道理的,因为它不是标准的 JSON 由于类型变形)。
有一节是关于为 RestSharp 编写自定义解析器的here
他们告诉你实现 IDeserializer
,但我建议你简单地扩展 JsonDeserializer
以添加你的特殊自定义功能,然后将其他一切委托给超级 class。