2017-04-03 14 views
0

C#を使用すると、動的JSONオブジェクトを逆シリアル化する正しい方法は何ですか?つまり、単一のキーの型がオブジェクト間で変更できるいくつかのJSONですか?例えばカスタム動的JSON逆シリアル化

、私はこの(完全に有効な)JSONしている場合:thingは私が定義され、これらのクラスを持っている場合、私はこれをデシリアライズないか、文字列または文字列の配列のいずれかになります

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

を?

Newtonsoft.Json.JsonSerializationException::「(例えば{ "名前" 現在のJSONオブジェクトをデシリアライズできません: "の値を" 私は(予想通り)例外に遭遇デシリアライズしようとすると

class ThingContainer { 
    List<Thing> stuffs; 
} 

class Thing { 
    List<string> content; 
} 

})を型 '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には、オブジェクトのリストである「stuffs」オブジェクトが含まれています。「content」は文字列のリストです。

C#クラスには、文字列のリストであるオブジェクトが含まれています。

文字列のリストを含むオブジェクトのリストであるオブジェクトを含むオブジェクトが必要です。

このお試しください:私はそこにあればC#での任意のソリューションを知らないが、私はのようなあなたのJSON構造をadapteすることができ奨め

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つの項目であってもリストにデシリアライズするカスタムフォーマッタ/デシリアライザの場合は機能しませんか? –

+1

私はそれがリストであり、私の応答が更新されたという最後の要求に気付きました。 –

0

を:

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

し、すべての詰め込むためのモデルを定義します:

0

これがNewtonSoftでできるのかどうかはわかりませんが、Windowsの組み込みAPI .Data.Jsonでは、必要な柔軟性を得ることができます。

関連する問題