5

Podio から JSON 文字列を読み取り、内容を c# オブジェクトに変換するプログラムを作成しています。

しかし、フィードを読んでいると、奇妙なフォーマットに出くわしました。オブジェクトの同じ階層レベルで、フィールド [値] の値が文字列である場合もあれば、複雑なオブジェクトである場合もあります。

例を以下に示します。

場所によってはこんな感じ

"values":[
    {
        "value":"Bug on User Interface, Ajax sometimes does not load properly"
    }
],
"type":"text"

そして、階層内の同じレベルにある次のアイテムでは、次のようになります

"values":[
    {
        "value":{
            "perma_link":"https:\/\/ds-test.podio.com\/myworkspace\/files\/23529948",
            "mimetype":"image\/jpeg",
            "hosted_by":"podio",
            "name":"217820_274164679355286_689330144_n.jpg",
            "hosted_by_humanized_name":"Podio",
            "description":null,
            "thumbnail_link":"https:\/\/files.podio.com\/23529948",
            "link":"https:\/\/files.podio.com\/23529948",
            "file_id":23529948,
            "size":39698
        }
    }
],
"type":"image"

「タイプ」の値に注意してください。最初のインスタンスでは「テキスト」、次のインスタンスでは「イメージ」です。DataContractJsonSerializer.Readそれらは階層の同じレベルにあるため、メソッドがスムーズに機能するようにオブジェクトを設計する方法がわかりません。

よろしく、

4

1 に答える 1

2

前もって言っておきますが、私は JSON の専門家ではありません (手を出したことがあります)。有能な C#.net プログラマーですが、.NET から JSON を操作したことはありません。今までに少なくとも 1 つの適切で決定的な回答があると思いますが、まだ回答がないので参考になる場合に備えて 0.02 ドルの価値を提供します。

http://www.json.orgによると、これは有効な形式です。(それが「奇妙な形式」であると言って、それが有効ではないと考えているのか、それとも単に珍しいと考えているのかはわかりません)。

説明した両方の例では、それらの間に一貫したパターンがあります。

<string1> : <value1>,
<string2> : <value2>

すべての場合において:

  • <string1> == "Values"
  • <string2> == "type"
  • <value1> == [ <object> ](つまり<value1>、常に単一の を含む配列です<object>)、および
  • <value2> == "a string describing the structure of the <object>"

また、<object>の場合は文字列、または の場合はコンマ区切りのリストに<value2> == "text"1 つ以上のペアを含むより複雑なオブジェクトです。<string> : <value><value2> != "text"

それで、.Netがこの標準フォーマットをすぐに処理できないと仮定して、どのように解析するか(私はそれができないことに驚いています)...

  • 関心のあるオブジェクトのみのクラス定義を作成します。JSON から必要な構造を収集できるはずです。

  • DataContractJsonSerializer(Type)文字列操作を実行して、関心のある型を「検索/抽出」し、それらの型ごとに明示的に設定することを考えたことはありますか?

  • それ以外の場合は、より一般的には<object>when内<value2> != "text"のすべてを として扱いDictionary<string,string>、必要に応じてケースバイケースでこれを処理できます<value2>(または、これらを「手動で」オブジェクトに変換することもできます)。 .


さらに、.NET 4.5 ではこのオーバーロードが導入されていることに注意してください。

DataContractJsonSerializer コンストラクター (型、DataContractJsonSerializerSettings)

次のような設定で:

そして特に興味深い:

...このインスタンス DataContractJsonSerializerSettings を使用してシリアル化されたオブジェクト グラフに存在する可能性のある型のコレクション。

これらは関連している可能性がありますが、これらの設定のいずれについてもこれ以上の情報を見つけることができません。おそらく、実験するためのものです.

于 2012-10-12T15:48:19.637 に答える