我正在尝试使用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文件中加载。
答案 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
,因此您会丢失订单信息。这是一个问题吗?