簡體   English   中英

使用DataContractJsonSerializer將Json反序列化為C#動態對象

[英]Deserialize Json into a C# dynamic object using DataContractJsonSerializer

我有一個與此問題相同的問題,因為我想反序列化動態json數據 換句話說,鍵:“ error1等是動態的。在我的情況下:

{
    "errors" : {
        "error1" : {
            "name"  : "connection error",
            "location" : "CPU board",
            "id"    : "E0001"
        },
        "warning2" : {
            "name"  : "Value not formatted",
            "location" : "Controller",
            "id"    : "W005"
        },
        "info4" : {
            "name"  : "Attention to temperature",
            "location" : "Heater",
            "id"    : "I008"
        }
    }
}

在問題中,答案使用JsonConvert反序列化為字典。 我在這里還發現可以使用JavascriptSerializer進行類似的操作。

我想我可以用那些來解決我的問題,但是我的問題是,我也可以使用DataContractJsonSerializer來做到這一點嗎?

您可以將其反序列化為對象字典:

var result = JsonConvert.DeserializeObject<Error>(json);

實現如下所示的類:

public class Error
{
  public class Details
  {
    public string Name {get;set}
    public string Id {get;set}
    public string Location {get;set}
  }
  public Dictionary<string, Details> Errors {get;set;}
}

您可以執行以下操作:

using(MemoryStream ms = new MemoryStream(Encoding.UTF8.GetBytes(json)))
{
    Error deserializedError = new Error();
    DataContractJsonSerializer ser = new DataContractJsonSerializer(deserializedError.GetType());

    deserializedError = ser.ReadObject(ms) as Error;  
}

如果要訪問對象數據(例如errors.error1.name etc..考慮使用dynamicExpandoObject 這是一個有效的例子

using (var f = new StreamReader("json1.json"))
{
    string json = f.ReadToEnd();
    dynamic deserializedObject = JsonConvert.DeserializeObject<ExpandoObject>(json);

    Console.WriteLine(deserializesObject.errors.error1.name);
}

輸出: connection error

我希望這有幫助。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM