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

本文关键字:Json 中将 phone Windows | 更新日期: 2023-09-27 18:35:26

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

有下一个 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 对象(例如 {"名称":"值"}) 输入类型"client_app。MainPage+RootObject[]' 因为该类型需要 一个 JSON 数组(例如 [1,2,3])以正确反序列化。要解决此问题 错误将 JSON 更改为 JSON 数组(例如 [1,2,3])或更改 反序列化类型,以便它是普通的 .NET 类型(例如,不是 基元类型(如整数),而不是集合类型(如数组或 列表),可以从 JSON 对象反序列化。 JsonObjectAttribute 也可以添加到类型中以强制其 从 JSON 对象反序列化。路径"名称",第 1 行,位置 8。

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

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

"IsEmpty":false

反序列化对象时,JSon 转换器会等待 IsEmpty 属性为布尔类型。事实并非如此,因为它的类型是列表

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

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

请像这样尝试:

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

这是您需要反序列化的类集

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);
var ds = new DataContractJsonSerializer(typeof(RootObject[]));
                var msnew = new MemoryStream(Encoding.UTF8.GetBytes(MyJsonString));
                RootObject[] items = (RootObject[])ds.ReadObject(msnew);    

这解决了我的问题

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

所以你应该是:

[
{
    "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 值上的方括号,表示该值位于集合中。 如果要分配多个值,则可以使用以下方法添加更多值:

"IsEmpty": [ false, true ]