C# 使用DataContractJsonSerialiser解析json文件
我有使用TexturePacker导出的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
{"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;
}