2012-11-29 163 views
3

我有這樣一個JSON:解析複雜的JSON對象用C#

{ 
    "name" : "MyCustomName", 
    "my_node" : { 
     "name" : "my_node_name" 
    }, 
    "dict1":"value1", 
    "dict2":"value2", 
    "dict3":"value3", 
    ... 
} 

和對象:

class Node{ 
    string value; 
} 

class Sample:IDictionary<string, string>{ 
    Node node; 
    string name; 
} 

節點名稱在Sample類總是存在。 事情是我不知道會有多少「dictN」字段......這就是要點。

問題是: 如何將該JSON反序列化爲此對象?

+2

這很好,你有一個問題......問題是? =) –

+0

偉大的問題:) –

+1

你有控制如何創建JSON。你可以使用一個數組是「字典」:[「val1」,「val2」,「val3 ...」]? – Pinetree

回答

2

編輯:顯然,即使字段名稱協調一致,您的反序列化器也無法應付與通用字典字段結合的特定字段。

在這種情況下,我只是勸反序列化作爲Dictionary<string, object>和建築與結果:

var d = new JavaScriptSerializer().Deserialize<Dictionary<string, object>>(json); 
Sample s = new Sample(); 
s.name = (string)d["name"]; 
Node n = new Node(); 
n.value = (string)((Dictionary<string, object>)d["my_node"])["name"]; 
foreach (var key in d.Keys.Except(new string[] { "name", "my_node" })) 
{ 
    s.Add(key, (string)d[key]); 
} 
+0

關於班級的變化,這沒有任何問題。我可以將Sample.node更改爲Sample.my_node,對於值相同 –

+0

嘗試一下,看看它是否有效,然後...... TBH如果能夠成功地決定「此值在某個字段中發生,我會感到驚訝,這個值在繼承的字典中「。 – Rawling

+0

它仍然沒有工作,是關於通過正確的值(收集)和有時在左邊(領域)傳遞值可以混淆的問題:/ –

1

最初的想法

下面是一本字典串行器。它有一個不接受空字符串的特殊情況。

private void SerializePerinatalModel<T>(IDictionary<string, object> dataModel, T perinatalModel) 
    { 
     Type sourceType = typeof(T); 
     foreach (PropertyInfo propInfo in (sourceType.GetProperties())) 
     { 
      if (dataModel.ContainsKey(propInfo.Name)) 
      { 
       // if an empty string has been returned don't change the value 
       if (dataModel[propInfo.Name].ToNullSafeString() != String.Empty) 
       { 
        try 
        { 
         Type localType = propInfo.PropertyType; 
         localType = Nullable.GetUnderlyingType(localType) ?? localType; 
         propInfo.SetValue(perinatalModel, Convert.ChangeType(dataModel[propInfo.Name], localType), null); 
        } 
        catch (Exception e) 
        { 
         // ToDo: log update value errors 
        } 

       } 
      } 

     } 
    } 

但是可以設置爲null安全。它處理可空類型。

由於JSON本質上是一種字典類型,因此通過頂層類型進行迭代應該可以達到目的。

這是寫得很快,所以只是一個想法的草圖。

更好的主意 同時嘗試使用

foreach (var item in JsonData.Where(m => m.Key.Substring(0,4) == "dict")) 
{ 
    // add item to collection 
} 

也可能做的BIZ。

1

您可以簡單地以Dictionary<string, object>的形式輸出,請嘗試使用這段代碼。

System.Web.Script.Serialization.JavaScriptSerializer s = 
    new System.Web.Script.Serialization.JavaScriptSerializer(); 

var nodes = s.Deserialize<Dictionary<string, object>>(jsonString); 
var dictNodes = nodes.Where(w => w.Key.StartsWith("dict")); 
+0

好的....也許我的例子不是很好......但如果會有像「mydict1」這樣的字段呢。我只專注於只有兩個領域,我相信總是其餘的應該進入容器。 –

+1

所以你可以用我的代碼來實現它。其實質在於這一行代碼'nodes.Where(w => w.Key.StartsWith(「dict」));'這將在過濾後爲您提供所有具有dictN元素的節點。 –