代码之家  ›  专栏  ›  技术社区  ›  Michael Grinnell

如何从json字符串c_newtonsoft.json中获取对象列表

  •  2
  • Michael Grinnell  · 技术社区  · 8 年前

    我正试图将JSON字符串转换为对象列表,但得到了错误信息。

    无法将当前JSON对象反序列化到类型列表中,因为该类型需要JSON数组才能正确反序列化。

    我取回JSON,它看起来像这样

    {
        "Code":0,
        "Message":"OK",
        "Data":
        {
            "Houses":
            [
                {
                    "Id":1,
                    "Name":"House 1",
                    "Area":"22.00",
                    "ShortName":"H1",
                    "FarmName":"Farm 1"
                },
                {
                    "Id":2,
                    "Name":"Farmi1 - House 1",
                    "Area":"1000.00",
                    "ShortName":"H1",
                    "FarmName":"Farm 1"
                }
            ]
        }
    }
    

    然后我说

    List<House> Houses = JsonConvert.DeserializeObject<List<House>>(json); 
    
    6 回复  |  直到 8 年前
        1
  •  3
  •   derpirscher    8 年前

    您得到的JSON字符串不是一个列表,而是一个在嵌套级别上具有列表的对象。您必须反序列化最外层的结构,然后获取相应的嵌套属性。

    您可以定义一个表示数据完整结构的完整类,或者,如果您只对房屋列表感兴趣,只需使用Jobject

    var o = JsonConvert.DeserializeObject<JObject>(json);
    var h = o.Value<JObject>("Data")
        .Value<JArray>("Houses")
        .ToObject<List<Houses>>();
    
        2
  •  2
  •   MikeS    8 年前

    不能直接转到JSON字符串中的子节点。您必须创建一个类,该类的属性为“houses”,它是一个房屋列表,然后反序列化它。

    public class HouseList{
        public class HouseData{
           List<House> Houses {get;set;|
        }
        public string Code {get;set;}
        public string Message {get;set;}
       public HouseData Data {get;set;}
    }
    
    var houseList = JsonConvert.DeserializeObject<HouseList>(json).Data.Houses; 
    

    像那样。

        3
  •  0
  •   Cid Gordon    8 年前

    我假设你有一个这样的收藏室:

    public class Houses : List<House>
    {
    
    }
    

    您可能需要一个包含JSON根结构的根对象

    public class Datas
    {
        public Houses Houses;
    }
    
    using Newtonsoft.Json;
    
    public class RootObject
    {
        [JsonProperty("Code")]
        public int Code { get; set; }
    
        [JsonProperty("Message")]
        public string Message { get; set; }
    
        [JsonProperty("Data")]
        public Datas Data { get; set; }
    }
    

    然后,将所有内容反序列化为

    var MyJSON = JsonConvert.DeserializeObject<RootObject>(json);
    

    你可以用 MyJSON.Data.Houses

        4
  •  0
  •   L_J    8 年前

    您可以使用两个类反序列化如下:

    class Program
    {
        static void Main(string[] args)
        {
            string json = "{\"Code\":0,\"Message\":\"OK\",\"Data\":{\"Houses\":[{\"Id\":1,\"Name\":\"House 1\",\"Area\":\"22.00\",\"ShortName\":\"H1\",\"FarmName\":\"Farm 1\"},{\"Id\":2,\"Name\":\"Farmi1 - House 1\",\"Area\":\"1000.00\",\"ShortName\":\"H1\",\"FarmName\":\"Farm 1\"}]}}";
            var obj = JsonConvert.DeserializeObject<MainClass>(json);
            ShowObject(obj);
            Console.Read();
        }
    
        static void ShowObject(MainClass obj)
        {
            Console.WriteLine("Code: " + obj.Code);
            Console.WriteLine("Message: " + obj.Message);
            Console.WriteLine("Data:\n " + obj.Data.Keys.ElementAt(0));
            foreach (var house in obj.Data.Values.ElementAt(0))
            {
                Console.WriteLine("  Id: " + house.Id);
                Console.WriteLine("  Name: " + house.Name);
                Console.WriteLine("  Area: " + house.Area);
                Console.WriteLine("  ShortName: " + house.ShortName);
                Console.WriteLine("  FarmName: " + house.FarmName);
                Console.WriteLine();
            }
        }
    }
    
    class MainClass
    {
        public int Code { get; set; }
        public string Message { get; set; }
    
        public Dictionary<string, House[]> Data { get; set; }
    }
    
    class House
    {
        public int Id { get; set; }
        public string Name { get; set; }
        public string Area { get; set; }
        public string ShortName { get; set; }
        public string FarmName { get; set; }
    }
    

    输出: Code: 0 Message: OK Data: Houses Id: 1 Name: House 1 Area: 22.00 ShortName: H1 FarmName: Farm 1 Id: 2 Name: Farmi1 - House 1 Area: 1000.00 ShortName: H1 FarmName: Farm 1

        5
  •  0
  •   Seyed Reza Dadrezaei    8 年前

    在中运行此代码 http://rextester.com/

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text.RegularExpressions;
    using Newtonsoft.Json;
    
    namespace Rextester
    {
        public class House
        {
            public int Id {set; get;}
            public string Name {set; get;}
            public float Area{set; get;}
            public string ShortName{set; get;}
            public string FarmName{set; get;}
    
        }
        public class MyJason
        {
            public int Code { set; get; }
            public string Message { set; get; }
            public MyData Data { set; get; }
    
        }
    
        public class MyData
        {
            public MyData()
            {
                Houses = new List<House>();
            }
            public List<House> Houses { set; get; }
        }
    
        public class Program
        {
            public static void Main(string[] args)
            {
                string jason= "{'Code':0,'Message':'OK','Data':{'Houses':[{'Id':1,'Name':'House 1','Area':'22.00','ShortName':'H1','FarmName':'Farm 1'},{'Id':2,'Name':'Farmi1 - House 1','Area':'1000.00','ShortName':'H1','FarmName':'Farm 1'}]}}";
                MyJason myJson = JsonConvert.DeserializeObject<MyJason>(jason);
                List<House> Houses = new List<House>();
                Houses = myJson.Data.Houses;
                Console.WriteLine(Houses.FirstOrDefault().Name);
    
            }
        }
    }
    
        6
  •  -1
  •   Bob K    8 年前

    嵌套在具有代码、消息和数据的父对象中的房屋列表。 首先尝试反序列化父对象,然后可以从数据中提取房屋。