繁体   English   中英

当嵌套对象为空时,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为空时,我收到此异常:

无法将类型为“ System.String”的对象转换为类型为“ System.Collections.Generic.IDictionary`2 [System.String,System.Object]”。

可以这样反序列化吗? 不幸的是,不可能更改WebService的响应,因此我应该在我的应用程序中正确解析它。

只需使用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节在这里

他们告诉您实现IDeserializer但我建议您仅扩展JsonDeserializer即可添加特殊的自定义功能,然后将其委托给超类。

原因是因为在

{
"my_obj":{
    "id":"test",
    "nested_obj":{
        "value":"testValue",
        "desc":"testDesc"}
    }
}

嵌套对象正在接收对象类型

而在

{
"my_obj":{
    "id":"test",
    "nested_obj":""
    }
}

它正在接收字符串类型。

如果

它返回

{
"my_obj":{
    "id":"test",
    "nested_obj":null
    }
}

那么它将能够成功解析。

尝试使用http://json2csharp.com/转换两个json并查看其中的区别

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM