簡體   English   中英

如何從JSON字符串C#Newtonsoft.json獲取對象列表

[英]How to get list of objects from json string c# Newtonsoft.json

我正在嘗試將JSON字符串轉換為對象列表,但出現錯誤

無法將當前JSON對象反序列化為List類型,因為該類型需要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); 

您獲得的JSON字符串不是列表,而是一個在嵌套級別具有列表的對象。 您將必須反序列化最外面的結構,然后獲取各自的嵌套屬性。

您可以定義代表數據完整結構的整個類,或者,如果您僅對房屋清單感興趣,則只需使用JObjects

var o = JsonConvert.DeserializeObject<JObject>(json);
var h = o.Value<JObject>("Data")
    .Value<JArray>("Houses")
    .ToObject<List<Houses>>();

您不能直接進入json字符串中的子節點。 您必須創建一個具有“房屋”屬性的類,該類是房屋列表,然后將其反序列化。

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; 

這樣的事情。

您可以使用兩個類來反序列化如下:

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 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

我假設您有一個像這樣建造的收藏房屋:

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訪問房屋

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);

        }
    }
}

嵌套在具有代碼,消息和數據的父對象中的房屋列表。 首先嘗試反序列化父對象,然后可以從數據中提取房屋。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM