如何在c#中将Json解析为类(Windows Phone 8)?

时间:2014-12-25 13:08:41

标签: c# json

也许有人知道更好的版本来解决我的问题?

有下一个json:

[  
   {  
      "name":{  
         "IsEmpty":false,
         "X":-10.5,
         "Y":2.47
      },
      "password":"pas"
   },
   {  
      "name":{  
         "IsEmpty":false,
         "X":-10.5,
         "Y":2.47
      },
      "password":"pas"
   },
   {  
      "name":{  
         "IsEmpty":false,
         "X":-10.5,
         "Y":2.47
      },
      "password":"pas"
   }
]

我想要从json到我的类的解析元素:

 public class Name
    {
        public bool IsEmpty { get; set; }
        public double X { get; set; }
        public double Y { get; set; }
    }

    public class RootObject
    {
        public List<Name> name { get; set; }
        public string password { get; set; }
    }  

...

    dynamic res = JsonConvert.DeserializeObject<RootObject[]>(result1);

变量result1是我的json对象。

并且执行,我有:

  

无法反序列化当前的JSON对象(例如{“name”:“value”})   到类型'client_app.MainPage + RootObject []'因为类型需要   一个JSON数组(例如[1,2,3])正确反序列化。解决这个问题   错误要么将JSON更改为JSON数组(例如[1,2,3]),要么更改   反序列化类型,以便它是一个普通的.NET类型(例如,不是   原始类型,如整数,而不是像数组或类似的集合类型   List)可以从JSON对象反序列化。   JsonObjectAttribute也可以添加到类型中以强制它   从JSON对象反序列化。路径'名称',第1行,第8位。

5 个答案:

答案 0 :(得分:1)

问题在于您的JSon字符串和根对象之间的映射。我认为这是导致问题的原因:

"IsEmpty":false

反序列化对象时,JSon转换器等待IsEmpty属性为 bool 类型。 情况不是这样,因为它的类型是 List

所以你的根类应该是这样的:

     public class RootObject
     {
        public Name name { get; set; }
        public string password { get; set; }
     }  

答案 1 :(得分:0)

请尝试这样:

 var res = JsonConvert.DeserializeObject<List<RootObject>>(result1);

答案 2 :(得分:0)

这是您需要反序列化的一组类

public class Name
{
    public bool IsEmpty { get; set; }
    public double X { get; set; }
    public double Y { get; set; }
}

public class Item
{
    public Name name { get; set; }
    public string password { get; set; }
}

然后

var items = Newtonsoft.Json.JsonConvert.DeserializeObject<Item[]>(json);

答案 3 :(得分:-1)

var ds = new DataContractJsonSerializer(typeof(RootObject[]));
                var msnew = new MemoryStream(Encoding.UTF8.GetBytes(MyJsonString));
                RootObject[] items = (RootObject[])ds.ReadObject(msnew);    

这解决了我的问题

答案 4 :(得分:-2)

您的Name类的IsEmpty属性为bools列表。

所以Json应该是:

[
{
    "name": {
        "IsEmpty": [
            false
        ],
        "X": -10.5,
        "Y": 2.47
    },
    "password": "pas"
},
{
    "name": {
        "IsEmpty": [
            false
        ],
        "X": -10.5,
        "Y": 2.47
    },
    "password": "pas"
},
{
    "name": {
        "IsEmpty": [
            false
        ],
        "X": -10.5,
        "Y": 2.47
    },
    "password": "pas"
}

注意IsEmpty值的sqaure括号,表示值在集合中。如果要分配多个值,则可以使用以下方法添加更多值:

"IsEmpty": [ false, true ]