C#DataContract具有非常量变量名称

时间:2013-05-31 21:01:21

标签: c# .net json parsing

我正在尝试使用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文件中加载。

3 个答案:

答案 0 :(得分:1)

使用Newtonsoft的Json.net JObject类来反序列化整个结构。

一旦你拥有了这个,就可以遍历'frames'的子项。

对于每个孩子,您可以创建一个新的JsonReader对象并从该点反序列化。

答案 1 :(得分: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; }
}

答案 2 :(得分:0)

您可以定义一个明显的FrameInfo类(具有属性框架,旋转等)。然后,您可以从“frames”属性反序列化Dictionary<String, FrameInfo>。显然,这会为您提供Dictionary而不是Array,因此您会丢失订单信息。这是一个问题吗?