2

DataContractJsonSerializer クラスを使用して混合型の JSON 配列を逆シリアル化する際に問題があります。無駄な解決策を探すのに多くの時間を費やしたので、先に進んでここで質問しようと思いました.

基本的に、以下のような JSON 文字列を取得しています。位置 0 に Int32 があり、位置 1 に文字列があり、位置 2 にカスタム クラスのインスタンスがあるリストに逆シリアル化する配列を取得したいと思います。

[
   2,
   "Mr. Smith",
   {
      "num":169,
      "name":"main street",
      "state":66
   }
]

次のようにシリアライズを作成するだけの場合:

DataContractJsonSerializer ser = new DataContractJsonSerializer(typeof(List<object>))

実際には、位置 0 で Int32 を取得し、位置 1 で String を取得します。ただし、位置 2 では null オブジェクトを取得するだけです。

私がやろうとしていることさえ可能かどうか誰にも分かりますか? 消費している JSON の構造を制御することはできません。可能であれば、サードパーティのアセンブリを使用せずにこれを実現したいと考えています。

4

2 に答える 2

2

次のような json 構造を再現するクラスを作成する必要があります。

[DataContract]
public class MyClass {
    [DataMember]
    public int IntMember { get; set; }
    [DataMember]
    public string StringMember { get; set; }
    [DataMember]
    public MyType[] AllTypes { get; set;}
}

[DataContract]
public class MyType {
    [DataMember]
    public int num { get; set; }
    [DataMember]
    public string name { get; set; }
    [DataMember]
    public int state { get; set;}
}

クラスとそのプロパティを「DataContract」および「DataMember」属性で装飾します。次に、逆シリアル化コードで、次の例のように作成したクラスを使用します

var serializer = new DataContractJsonSerializer(typeof(MyClass));
System.IO.StringReader reader = new System.IO.StringReader(jsonData);
System.IO.MemoryStream ms = new System.IO.MemoryStream(Encoding.Default.GetBytes(jsonData));
return serializer.ReadObject(ms) as MyClass;
于 2010-10-11T00:43:49.603 に答える
1

マイク、

問題は、逆シリアル化中に、位置 2 の要素をどの型に逆シリアル化するかを JSON デシリアライザーが認識できないことです。

「__type」ヒントを提供する必要があります。ポリモーフィックな状況で実際に JSON にシリアル化し、どのタイプのヒントが出力されるかを確認することで、特定のタイプの __type ヒントを取得できます。

詳細については、http://msdn.microsoft.com/en-us/library/bb412170.aspxを参照してください。「オブジェクトに割り当てられたコレクション」および「型情報の保持」のセクションに特に注意してください。

于 2011-02-02T02:29:11.120 に答える