Использование DataContractJsonSerialiser для анализа файла json - PullRequest
1 голос
/ 26 июля 2011

У меня есть файл json, который я экспортировал с использованием TexturePacker, и он создает этот формат.

{"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 Phone 7. Такое ощущение, что у меня есть реверс-инженер для каждого формата, а не просто для чтения, как он анализируется.

Как мне создать объект с контрактом данных для загрузки этого формата?

Мой вопрос также похож на следующий вопрос https://stackoverflow.com/questions/3769322/datacontractjsonserializer-with-arbitrary-key-names, на который нет ответа

@ Андреас Лёв, если бы вы могли экспортировать в такой формат, как это было бы здорово.

{"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 Ответ

1 голос
/ 26 июля 2011

Инструмент http://carlosfigueira.me/JsonUtilities/JsonToContract.htm (описанный в сообщении в блоге http://blogs.msdn.com/b/carlosfigueira/archive/2011/01/11/inferring-schemas-for-json.aspx) можно использовать для создания графа объектов, который можно использовать для десериализации этого JSON с использованием DataContractJsonSerializer. Это результат вывода инструмент (мне пришлось изменить имя класса «But_01_Highlight.png» на «But_01_Highlight_png» из-за ошибки в инструменте).

Кроме того, это работает, учитывая, что все данные JSON соответствуют одной и той же "схеме". Если это не так, то DataContractJsonSerializer - не лучший вариант для этого. Для WP7 вы можете использовать некоторую библиотеку JSON, например, классы в пространстве имен System.Json (необходимо добавить ссылку на System.Json.dll из пакета Silverlight 3.0 SDK)

[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;
}
...