1

小さい、固定サイズ、固定構造、固定フィールド名、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 文字列を照会する必要があります。次に、実行時に、これらの変数名のクラス オブジェクトを含むクラス (リフレクション?) を作成しますか? あまりにも面倒に見えます...おそらくもっと健全な方法がありますか?

それとも、クラス/フィールド名は .NET のJavaScriptSerializerとは無関係であり、すべての問題は型ですか? (そしてもちろん正しい構造)

4

1 に答える 1

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>次に、オブジェクト グラフのルートを、 ...を含むオブジェクトに逆シリアル化します。

public class SomeContainer
{
    public Dictionary<string,GenericObject> container {get;set;}
}

キーの名前を気にしない場合は、辞書の値をループできます。

于 2012-10-25T16:13:27.423 に答える