2012-05-08 63 views
1

當Json字符串包含'key1:value1'時,可以將其轉換爲字典類型。當Json字符串包含字符串和字符串數組時,JSON序列化程序出現問題

但在我的情況下,還包含一個字符串與上述密鑰一起的數組:值,即:(JSON數據包含一些串和一些陣列)

{k1:v1; "key2\":[{\"Key11\":{\"key21\":\"Val21\",\"key22\":\"val22\"}] 

當我用字典<字符串,字符串[]>或字典<串,的ArrayList> - 這是在值未按照串 - 不能轉換字符串字符串[]等

儘管如此字典<串,對象>可以是你sed,但是有沒有更好的方法來處理這個問題?

感謝 Phani

+0

它是你寫的一個固定的結構,還是你在尋找一個通用的解決方案? – McGarnagle

+0

通用解決方案,假設我們不知道結構... – HydPhani

回答

1

如果你不知道在編譯時的結構,那麼就沒有其他辦法來序列化一個JSON string--它必須是詞典<字符串,對象>。但是,如果您使用C#4.0,則可以使用DynamicObject。由於動態類型化將類型解析延遲到運行時,如果使用此方法進行序列化,則可以將序列化對象視爲強類型對象(儘管無需編譯時支持)。這意味着你可以使用JSON式的點標記來訪問屬性:

MyDynamicJsonObject.key2 

要做到這一點,你可以從DynamicObject繼承,並實現TryGetMember方法(quoted from this link, which has a full implementation)

public class DynamicJsonObject : DynamicObject 
{ 
    private IDictionary<string, object> Dictionary { get; set; } 

    public DynamicJsonObject(IDictionary<string, object> dictionary) 
    { 
     this.Dictionary = dictionary; 
    } 

    public override bool TryGetMember(GetMemberBinder binder, out object result) 
    { 
     result = this.Dictionary[binder.Name]; 

     if (result is IDictionary<string, object>) 
     { 
      result = new DynamicJsonObject(result as IDictionary<string, object>); 
     } 
     else if (result is ArrayList && (result as ArrayList) is IDictionary<string, object>) 
     { 
      result = new List<DynamicJsonObject>((result as ArrayList).ToArray().Select(x => new DynamicJsonObject(x as IDictionary<string, object>))); 
     } 
     else if (result is ArrayList) 
     { 
      result = new List<object>((result as ArrayList).ToArray()); 
     } 

     return this.Dictionary.ContainsKey(binder.Name); 
    } 
} 

注意動態類型目前不支持索引器表示法,因此對於數組,您需要implement a workaround using notation like this

MyDynamicJsonObject.key2.Item(0) 
0

您的示例不是有效的JSON,例如每個鍵和值都應該被"圍繞,例如, {"k1":"v1"},開啓和關閉大括號的數量必須匹配,如果您使用\"轉義"字符,則必須添加另一個"字符,例如,使用JSONLint等工具來驗證您的JSON是正確的。