2013-05-31 111 views
2

我試圖解析一個JSON文件在C#中使用數據約定,但我有一個問題,因爲成員名稱並不總是恆定的,但結構是。C#DataContract與非常量變量名稱

拿這個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文件加載。

回答

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; } 
} 
+0

謝謝。我會嘗試JSON.NET。任何你可以將它翻譯成C#的機會?另外,我需要維護JSON文件中的順序,我知道字典會使我失去它。 – tbkn23

+0

a)它已經是c#b)如果你對frame-name不感興趣,你可以用'.Select(p => p.Value.ToObject ())替換'.ToDictionary(...)'。ToList );' – I4V

+0

它不能識別'OfType()'方法' – tbkn23

0

有一個明顯的FrameInfo類可以定義(與屬性框架,旋轉等)。然後你可以從「frames」屬性反序列化一個Dictionary<String, FrameInfo>。顯然這給你一個Dictionary而不是Array,所以你失去了訂單信息。那是問題嗎?

+0

實際上,它是......幀的順序很重要。另外,如何反序列化字典? – tbkn23

1

使用Newtonsoft的Json.net JObject類來反序列化整個結構。

一旦你有了,你可以迭代'框架'的孩子。

對於每個孩子,您可以創建一個新的JsonReader對象並從該點開始反序列化。