2011-07-26 53 views
1

我有使用TexturePacker導出的json文件,並且它生成此格式。使用DataContractJsonSerialiser解析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} 
    }, 

我下面的教程,你可以只把它變成一個數組,但是這並不適用於Windows電話7這種感覺就像我有逆向工程師每種格式,而不是僅僅把它讀作解析。

我該如何創建一個帶有datacontract的對象來加載這種格式?

我的問題也是類似以下問題https://stackoverflow.com/questions/3769322/datacontractjsonserializer-with-arbitrary-key-names它沒有答案

@Andreas低如果你能出口到像這樣這將是巨大的格式。

{"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} 
    }, 
    ... 
    ] 

回答

1

http://carlosfigueira.me/JsonUtilities/JsonToContract.htm(在博客帖子http://blogs.msdn.com/b/carlosfigueira/archive/2011/01/11/inferring-schemas-for-json.aspx描述)該工具可用於創建可用於反序列化使用DataContractJsonSerializer該JSON一個對象圖。這是該工具的輸出(由於該工具存在錯誤,我必須將類「But_01_Highlight.png」的名稱更改爲「But_01_Highlight_png」)。

此外,由於所有的JSON數據都遵循相同的「模式」,因此這種方法可行。如果情況並非如此,那麼DataContractJsonSerializer不是最好的選擇。對於WP7,你可以使用一些JSON庫如在System.Json namespace類(你需要參考從Silverlight的3.0 SDK添加到System.Json.dll)

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

的巴紐顯然將不得不適應轉換成一個字符串,在這個例子中它是一個值而不是類名。但感謝鏈接到該工具。 –

+0

是的,我忘記更新數據協定屬性中的「名稱」屬性。它現在應該工作。 – carlosfigueira

+0

我不這會工作,如果.png文件列表是由服務動態生成的話會怎麼樣。應該由序列化器動態加載「But_01_Highlight.png」。 –