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”具有完全相同的结构,但名称不同。所以我想要一个有一个框架数组的类(每个框架都有框架、旋转、修剪、spriteSourceSize 和 sourceSize 元素),将从这个 JSON 文件中加载。

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”属性反序列化一个。显然这给了你 aDictionary而不是 a Array,所以你会丢失订单信息。那是问题吗?

于 2013-05-31T21:15:34.387 回答