[英]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.