Как десериализовать дерево данных JSON? - PullRequest
0 голосов
/ 27 мая 2011

Предположим, у меня есть данные JSON, отформатированные как: (вид данных дерева:)

{ "NodeData": [ "NodeObject":
{ "nodeName": "Node 1",

    "nodeChildren":
        [
            "nodeObject":
            {
            "nodeName": "Node 1-1"
            },
            "nodeObject":
            {
            "nodeName": "Node 1-2"

            },
            "nodeObject":
            {
            "nodeName": "Node 1-3",    
            "nodeChildren":
                [
                    "nodeObject":
                    {
                    "nodeName": "Node 1-3-1"        
                    }
                ]
            },

            "nodeObject":
            {
            "nodeName": "Node 1-4"

            },

            "nodeObject":
            {
            "nodeName": "Node 1-5",        
            }
        ]
},

"nodeObject":
{
"nodeName": "Node 2",
},

"nodeObject":
{
"nodeName": "Node 3",
}

] }

чтобы десериализовать эти данные, в приложении SL я определил внутренний класс для соответствия модели данных JSON, например:

[DataContract]
internal class nodeObject
{
    [DataMember]
    public string nodeName;     
    [DataMember]
    public nodeObject nodeChildren;
}

затем используйте DataContractJsonSerializer для получения данных, но я получил вид ошибки:

В JSON обнаружен неожиданный символ. Ожидаемый ',', получил ':'. (37):

поскольку данные - это своего рода дерево, список может не подходить для таких данных?

Как решить эту проблему?


Спасибо, ребята. Если данные json хорошо отформатированы, я использую следующий вид кода для десериализации объекта для вышеуказанных данных:

var jsonSerializer = new DataContractJsonSerializer(typeof(List<nodeObject>));  
var nodes = jsonSerializer.ReadObject(e.Result) as List<nodeObject>;  
this.listBox1.ItemsSource = nodes;  

Но я все равно получаю ноль для узлов.

Не уверен, как десериализовать объект с помощью этого кнода данных дерева.

Ответы [ 3 ]

1 голос
/ 27 мая 2011

Ваши данные не действительны в формате JSON. Я переформатировал это так, что это

    {
    "nodeData": [
        "nodeObject",
        {
            "nodeName": "Node 1",
            "nodeChildren": [
                "nodeObject",
                {
                    "nodeName": "Node 1-1"
                },
                "nodeObject",
                {
                    "nodeName": "Node 1-2"
                },
                "nodeObject",
                {
                    "nodeName": "Node 1-3",
                    "nodeChildren": [
                        "nodeObject",
                        {
                            "nodeName": "Node 1-3-1"
                        }
                    ]
                },
                "nodeObject",
                {
                    "nodeName": "Node 1-4"
                },
                "nodeObject",
                {
                    "nodeName": "Node 1-5"
                }
            ]
        },
        "nodeObject",
        {
            "nodeName": "Node 2"
        },
        "nodeObject",
        {
            "nodeName": "Node 3"
        }
    ]
}

Используйте JSON Lint для проверки ваших данных.

1 голос
/ 27 мая 2011

Ваш JSON не является допустимым JavaScript.Вы не можете определить ключи для элементов массива.Например, в первой строке вашего кода:

 [ 
     "nodeObject":
         { "nodeName":
          //...
 ]

ваш код должен быть отформатирован так:

[ {"nodeName": "Node-1-1"}, {"nodeName": "Node-1-2"} /* ... */ ]
0 голосов
/ 13 июля 2011

Обратите внимание, что DataContractJsonSerializer поддерживает только следующие кодировки: UTF-8, UTF-16LE и UTF-16BE.Чтобы это работало, вам нужно сделать что-то вроде:

                DataContractJsonSerializer json = new DataContractJsonSerializer(typeof(List<Client>));

                System.IO.MemoryStream clientListStream = new System.IO.MemoryStream();

                clientListStream.Write(System.Text.Encoding.UTF8.GetBytes(e.Result), 0, e.Result.Length);

                List<Client> Clients = json.ReadObject(clientListStream) as List<Client>;
                dgMain.ItemsSource = Clients;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...