如何反序列化JSON数据树?

时间:2011-05-27 16:49:45

标签: json rest silverlight-4.0

假设我将JSON数据格式化为:(树数据类型:)

{ “NODEDATA”: [     “nodeObject”:
    {         “nodeName”:“节点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):

因为数据是一种树,List可能不适合这种数据吗?

如何解决此问题?


谢谢,伙计们。如果json数据格式良好,那么我使用以下类型的代码来反序列出上述数据的对象:

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

但我仍然为节点获取null。

不确定如何使用此knid树数据反序列化对象。

3 个答案:

答案 0 :(得分:1)

你的json是无效的javascript。您无法为数组元素定义键。例如,在代码的第一行:

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

您的代码需要格式化为:

[ {"nodeName": "Node-1-1"}, {"nodeName": "Node-1-2"} /* ... */ ]

答案 1 :(得分:1)

您的数据无效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验证您的数据。

答案 2 :(得分:0)

请注意,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;