11

私は次のようなjson構造を持っています:

"list":[
  {
    "type":"link",
    "href":"http://google.com"
  },
  {
    "type":"image",
    "src":"http://google.com/logo.png"
  },
  {
    "type":"text",
    "text":"some text here"
  },
]

これをオブジェクトのリストに逆シリアル化したいのですが、各オブジェクトは基本クラスのサブクラスです。リスト内の各アイテムには異なるプロパティ(href、src、text)があるため、同じクラスを使用してリーチすることはできません。代わりに、一般的なクラスの3つのサブクラスが必要です。JSONリストの各アイテムのtypeプロパティを使用して、使用するサブクラスを決定できます。たとえば、次のクラスを作成できます

public Item{
  public string type {get; set;}
}
public LinkItem : Item {
  public string href {get; set;}
}
public ImageItem : Item {
  public string src {get; set;}
}
public TextItem : Item {
  public string text {get; set;}
}

これを行う方法はありますか?または、異種オブジェクトタイプのリストを逆シリアル化するためのより良い方法はありますか?

編集:

ちなみにjson.netを使っています

4

1 に答える 1

1

@AmithGeorgeが提案したように、オブジェクトを使用しdynamicてjsonオブジェクトを動的に解析できます。ShawnWeisfeldによるJSON用のこの優れた動的クラスを使用できます。これが彼のブログです

JavaScriptSerializer jss = new JavaScriptSerializer();
jss.RegisterConverters(new JavaScriptConverter[] { new DynamicJsonConverter() });

dynamic glossaryEntry = jss.Deserialize(json, typeof(object)) as dynamic;

Console.WriteLine("glossaryEntry.glossary.title: " + glossaryEntry.glossary.title);
Console.WriteLine("glossaryEntry.glossary.GlossDiv.title: " + glossaryEntry.glossary.GlossDiv.title);
Console.WriteLine("glossaryEntry.glossary.GlossDiv.GlossList.GlossEntry.ID: " + glossaryEntry.glossary.GlossDiv.GlossList.GlossEntry.ID);
Console.WriteLine("glossaryEntry.glossary.GlossDiv.GlossList.GlossEntry.GlossDef.para: " + glossaryEntry.glossary.GlossDiv.GlossList.GlossEntry.GlossDef.para);
foreach (var also in glossaryEntry.glossary.GlossDiv.GlossList.GlossEntry.GlossDef.GlossSeeAlso)
{
    Console.WriteLine("glossaryEntry.glossary.GlossDiv.GlossList.GlossEntry.GlossDef.GlossSeeAlso: " + also);
}
于 2012-07-11T09:54:22.537 に答える