簡體   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