2017-04-03 103 views
0

使用C#,反序列化動態JSON對象的正確方法是什麼(即:某個JSON可以在對象之間更改單個鍵的類型)?自定義動態JSON反序列化

例如,如果我有這樣的(完全有效的)JSON:

{ 
    "stuffs": [ 
    { "content": "abcd" }, 
    { "content": "efgh" }, 
    { "content": [ 
     "ijkl", 
     "mnop" 
    ]} 
    ] 
} 

其中thing可以是字符串或字符串數​​組,如何反序列化這一點,如果我已經定義這些類?

class ThingContainer { 
    List<Thing> stuffs; 
} 

class Thing { 
    List<string> content; 
} 

試圖反序列化I(果然)碰到一個例外:

Newtonsoft.Json.JsonSerializationException:「不能反序列化JSON當前對象(例如{ 「名」: 「值」 })類型'System.Collections.Generic.List`1 [DummyProject.Thing]'

+1

http://stackoverflow.com/questions/18994685/how-to-handle-both-a-single-item-and-an-array-for-the-same-property-using-json-n此帖子將幫助您設計解決方案。 – Sameer

+0

@Sameer謝謝,我不知道我在搜索現有問題時沒有發現。我想我做了一個重複。 –

回答

0

你的問題是,你的C#類不能準確地代表JSON。

您的JSON有一個對象,其中包含一個對象「東西」,對象列表「內容」是一個字符串列表。

你在C#類中有什麼是一個對象,它包含一個對象是一個字符串列表。

您需要一個包含對象的對象,該對象是包含字符串列表的對象列表。

試試這個:

public class Content 
{ 
    public List<string> Content { get; set; } 
} 

public class Stuff 
{ 
    public List<Content> Contents { get; set; } 
} 

public class ThingContainer 
{ 
    public List<Stuff> Stuffs { get; set; } 
} 
+0

這不適用於示例數組中的最後一個條件/條目,可能是將反序列化爲列表的自定義格式化程序/反序列化程序,即使它是扁平結構中的一個項目也是如此? –

+1

我注意到它的最後一項要求是列表並更新了我的回覆。 –

0

我不知道是否有在C#中的任何解決方案,但我recomended你adapte您的JSON結構,如:

{ 
    arrayStuffs[ 
    { content: ['123', '456'] }, 
    // another arrays... 
    ], 
    stringStuffs{ 
    content: '', 
    // another strings.. 
    }, 
    // another stuffs, and so on 
} 

,並定義一個模型,所有的東西:

public class arrayStuff{ 
    List<string> content; 
} 
0

我不確定這是否可以用NewtonSoft完成,但如果你回到Windows中的內置API .Data.Json你可以獲得你想要的任何靈活性。