2

C# でデータ コントラクトを使用して JSON ファイルを解析しようとしていますが、メンバー名が常に一定であるとは限らず、構造が一定であるため問題があります。

たとえば、次の JSON を使用します (テクスチャ パッカーによって作成されます)。

{
    "frames": {
        "frame-abc":
        {
            "frame": {"x":41,"y":2,"w":256,"h":256},
            "rotated": false,
            "trimmed": false,
            "spriteSourceSize": {"x":0,"y":0,"w":256,"h":256},
            "sourceSize": {"w":256,"h":256}
        },
        "someframe":
        {
            "frame": {"x":2,"y":2,"w":37,"h":382},
            "rotated": false,
            "trimmed": false,
            "spriteSourceSize": {"x":0,"y":0,"w":37,"h":382},
            "sourceSize": {"w":37,"h":382}
        }
    }
}

そのための DataContract を作成するにはどうすればよいですか? 「frame-abc」と「someframe」はまったく同じ構造ですが、名前が異なることに注意してください。したがって、この JSON ファイルからロードされるフレームの配列 (各フレームにはフレーム、回転、トリミング、spriteSourceSize、および sourceSize 要素があります) を持つクラスが必要です。

4

3 に答える 3

1

Newtonsoft の Json.netJObjectクラスを使用して、構造全体を逆シリアル化します。

それができたら、「フレーム」の子を反復処理できます。

子ごとに、新しいJsonReaderオブジェクトを作成し、その時点から逆シリアル化できます。

于 2013-05-31T21:23:16.193 に答える
1

いいえ、作成することはできませんDataContract。しかし、Json.netと Linq の助けを借りて、次のことができます。

var jObj = JObject.Parse(json);
var frameDict = jObj["frames"].Children()
               .OfType<JProperty>()
               .ToDictionary(p => p.Name, p => p.Value.ToObject<Frame>());


public class Rect
{
    public int x { get; set; }
    public int y { get; set; }
    public int w { get; set; }
    public int h { get; set; }
}

public class SSize
{
    public int w { get; set; }
    public int h { get; set; }
}

public class Frame
{
    public Rect frame { get; set; }
    public bool rotated { get; set; }
    public bool trimmed { get; set; }
    public Rect spriteSourceSize { get; set; }
    public SSize sourceSize { get; set; }
}
于 2013-05-31T21:24:52.267 に答える
0

定義できる明らかなFrameInfoクラスがあります (プロパティ フレーム、回転など)。Dictionary<String, FrameInfo>次に、「frames」プロパティからa を逆シリアル化できます。明らかに、これはではDictionaryなくを提供Arrayするため、注文情報が失われます。問題ありますか?

于 2013-05-31T21:15:34.387 に答える