2012-10-25 49 views
1

反序列化具有固定字段名稱的小型固定大小固定結構JSON字符串非常簡單:只需定義一個包含所有字段的類(使用正確的類型和名稱,全部在編譯時已知)。如何使用變量名反序列化可變大小的JSON字符串

反序列化可變大小的重複嵌套對,有點更具挑戰性,但可以在類內的List<>的幫助下完成。

但是,在編譯時未知字段的名稱時,我該怎麼辦?例如:

{ 
    "container":{ 
     "GD01AB491103":{ 
     "field_id1":11, 
     "field_id2":12, 
     "field_id3":13, 
     "field_id4":"fourteen" 
     }, 
     "DC01AB491103":{ 
     "field_id1":21, 
     "field_id2":22, 
     "field_id3":23, 
     "field_id4":"twenty four" 
     }, 
     "GH01AB451101":{ 
     "field_id1":31, 
     "field_id2":32, 
     "field_id3":33, 
     "field_id4":"thirty four" 
     } 
     . 
     . 
     . 
    }, 
    "terminator" 
} 

如何反序列化這樣的字符串?

(最好用.NET的JavaScriptSerializer但如果它是太弱/無力,我可能需要採取其他的東西)

編輯:爲了澄清挑戰的性質:在上面的例子中,爲了定義一個類:

public class ?????? 
{ 
    public int field_id1 {get;set;} 
    public int field_id2 {get;set;} 
    public int field_id3 {get;set;} 
    public string field_id4 {get;set;} 
} 

我需要先查詢JSON字符串,然後在運行時使用這些變量名類對象來構建類(reflection?)?看起來太麻煩了......也許有一種更好的方法?

或者也許類/字段名稱與.NET的JavaScriptSerializer不相關,並且所有事情都是類型? (當然,正確的結構)

回答

3

你或許可以更簡單地比你想象的..你??????類可以是任何東西做..

public class GenericObject 
{ 
    public int field_id1 {get;set;} 
    public int field_id2 {get;set;} 
    public int field_id3 {get;set;} 
    public string field_id4 {get;set;} 
} 

,然後反序列化對象圖的根到對象包含Dictionary<string,GenericObject> ...

然後你可以循環遍歷字典的值,如果你不關心鍵的名稱。

+0

謝謝。在我尋求使這個過程更簡單的方法的時候,我發現了這個很棒的網站,它從一個給定的JSON字符串中自動構建C#類:http://json2csharp.com/ –

+0

實際上,它可以與[JSON.net](http: /stackoverflow.com/a/1212115/562776)和.NET的[JavaScriptSerializer](http://msdn.microsoft.com/en-us/library/system.web.script.serialization.javascriptserializer%28v=vs.100% 29.aspx)。 –

+0

是的,它應該是非常獨立的序列化程序,我唯一擔心的就是尾隨的「終止符」條目,因爲它不是有效的JSON,但只要這只是一個提示,那麼你應該沒問題。 FWIW如果你有選擇(而不是太細微的.net泛型)我會建議通過JavaScriptSerializer的JSON.net出於性能原因。 –