【问题标题】:How to deserialize JSON data tree?如何反序列化 JSON 数据树?
【发布时间】:2014-03-23 10:12:28
【问题描述】:

假设我的 JSON 数据格式为:(树数据的种类:)

{ “节点数据”: [ “节点对象”:
{ "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;  

但我仍然得到节点的空值。

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

【问题讨论】:

    标签: json rest silverlight-4.0


    【解决方案1】:

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

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

    您的代码需要像这样格式化:

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

    【讨论】:

      【解决方案2】:

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

      【讨论】:

        【解决方案3】:

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

        【讨论】:

          猜你喜欢
          • 2013-08-17
          • 2016-05-14
          • 1970-01-01
          • 1970-01-01
          • 2018-04-22
          • 1970-01-01
          • 2017-03-30
          • 1970-01-01
          相关资源
          最近更新 更多