C# 使用DataContractJsonSerialiser解析json文件

C# 使用DataContractJsonSerialiser解析json文件,c#,serialization,windows-phone-7,datacontractserializer,C#,Serialization,Windows Phone 7,Datacontractserializer,我有使用TexturePacker导出的json文件,它生成这种格式 {"frames": { "But_01_Highlight.png": { "frame": {"x":0,"y":0,"w":280,"h":41}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":7,"y":8,"w":280,"h":41}, "so

我有使用TexturePacker导出的json文件,它生成这种格式

{"frames": {

    "But_01_Highlight.png":
    {
        "frame": {"x":0,"y":0,"w":280,"h":41},
        "rotated": false,
        "trimmed": true,
        "spriteSourceSize": {"x":7,"y":8,"w":280,"h":41},
        "sourceSize": {"w":294,"h":57}
    },
我正在学习一个教程,你可以把它转换成一个数组,但这在WindowsPhone7上是不可用的。感觉上我对每一种格式都进行了反向工程,而不仅仅是在解析时读取

如何使用datacontract创建对象以加载此格式

我的问题也类似于下面的问题,没有答案

@Andreas Löw如果你能导出到这样的格式,那就太好了

{"frames":[ 
    {
        "filename": "But_01_Highlight.png",
        "frame": {"x":0,"y":0,"w":280,"h":41},
        "rotated": false,
        "trimmed": true,
        "spriteSourceSize": {"x":7,"y":8,"w":280,"h":41},
        "sourceSize": {"w":294,"h":57}
    },
    ...
    ]
位于的工具(在博客文章中描述)可用于创建对象图,该对象图可用于使用DataContractJsonSerializer反序列化JSON。这是工具的输出(由于工具中的一个bug,我不得不将类的名称“But_01_Highlight.png”更改为“But_01_Highlight_png”)

此外,如果所有JSON数据都遵循相同的“模式”,那么这一点也行得通。如果不是这样,那么DataContractJsonSerializer就不是最好的选择。对于WP7,您可以使用一些JSON库,例如上的类(您需要从Silverlight 3.0 SDK添加对System.JSON.dll的引用)

位于的工具(在博客文章中描述)可用于创建对象图,该对象图可用于使用DataContractJsonSerializer反序列化JSON。这是工具的输出(由于工具中的一个bug,我不得不将类的名称“But_01_Highlight.png”更改为“But_01_Highlight_png”)

此外,如果所有JSON数据都遵循相同的“模式”,那么这一点也行得通。如果不是这样,那么DataContractJsonSerializer就不是最好的选择。对于WP7,您可以使用一些JSON库,例如上的类(您需要从Silverlight 3.0 SDK添加对System.JSON.dll的引用)


png显然必须放入一个字符串中,在这个实例中它是一个值而不是类名。但是谢谢你给我这个工具的链接。是的,我忘了更新数据契约属性中的“Name”属性。它现在应该可以工作了。我不认为这会工作,如果.png文件列表是由服务动态生成的呢。“But_01_Highlight.png”应该由序列化程序动态加载。正如我在回答中提到的,如果JSON符合固定模式(即,对象成员的名称是常量),DataContractJsonSerializer(DCJS)就会工作。如果不是这样的话,那么DCJS真的不是解决您问题的方法,您需要使用一些工具/框架/库,它可以让您在类似DOM的结构中加载JSON。显然,.png必须放入一个字符串,在这个实例中它是一个值,而不是一个类名。但是谢谢你给我这个工具的链接。是的,我忘了更新数据契约属性中的“Name”属性。它现在应该可以工作了。我不认为这会工作,如果.png文件列表是由服务动态生成的呢。“But_01_Highlight.png”应该由序列化程序动态加载。正如我在回答中提到的,如果JSON符合固定模式(即,对象成员的名称是常量),DataContractJsonSerializer(DCJS)就会工作。如果不是这样,那么DCJS确实不是解决问题的方法,您需要使用一些工具/框架/库,让您能够以类似DOM的结构加载JSON。
[System.Runtime.Serialization.DataContractAttribute()]
public partial class FrameClass
{

    [System.Runtime.Serialization.DataMemberAttribute()]
    public int x;

    [System.Runtime.Serialization.DataMemberAttribute()]
    public int y;

    [System.Runtime.Serialization.DataMemberAttribute()]
    public int w;

    [System.Runtime.Serialization.DataMemberAttribute()]
    public int h;
}

[System.Runtime.Serialization.DataContractAttribute()]
public partial class SourceSizeClass
{

    [System.Runtime.Serialization.DataMemberAttribute()]
    public int w;

    [System.Runtime.Serialization.DataMemberAttribute()]
    public int h;
}

[System.Runtime.Serialization.DataContractAttribute()]
public partial class But_01_Highlight_pngClass
{

    [System.Runtime.Serialization.DataMemberAttribute()]
    public FrameClass frame;

    [System.Runtime.Serialization.DataMemberAttribute()]
    public bool rotated;

    [System.Runtime.Serialization.DataMemberAttribute()]
    public bool trimmed;

    [System.Runtime.Serialization.DataMemberAttribute()]
    public FrameClass spriteSourceSize;

    [System.Runtime.Serialization.DataMemberAttribute()]
    public SourceSizeClass sourceSize;
}

[System.Runtime.Serialization.DataContractAttribute()]
public partial class FramesClass
{

    [System.Runtime.Serialization.DataMemberAttribute(Name = "But_01_Highlight.png")]
    public But_01_Highlight_pngClass But_01_Highlight_png;
}

[System.Runtime.Serialization.DataContractAttribute()]
public partial class RootClass
{

    [System.Runtime.Serialization.DataMemberAttribute()]
    public FramesClass frames;
}