[英]Deserialize JSON object in c# using Newtonsoft json.net
我有JSON數組。 我想將此映射/反序列化為以下類。
public sealed class DataItem{
public string UserId {get; set;}
public string TestId {get; set;}
public string UserName{get; set;}
public string Data1 {get; set;}
public string Data2 {get; set;}
public string Data3 {get; set;}
public string Data4 {get; set;}
public string Data5 {get; set;}
public string Data6 {get; set;}
public string Data7 {get; set;}
public string Data8 {get; set;}
public string Data9 {get; set;}
public string Data10 {get; set;}
...
...
}
JSON數組:
[{
"UserId": "5656",
"TestId": "562",
"UserName": "testuser",
"Data1": "dang",
"Data2": "phy",
"Data3": "right",
"Data4": "left",
"Data5": "top",
"Data6": "abc",
"Data7": "rat",
"Data8": "test",
"Data9": "91",
"Data10": "9090",
...
...
}, {
"UserId": "8989",
"TestId": "12",
"UserName": "abc",
"Data1": "111",
"Data2": "222",
"Data3": "Pwww",
"Data4": "aaa",
"Data5": "bbbb",
"Data6": "cc",
"Data7": "ooo",
"Data8": "hh",
"Data9": "g",
"Data10": "5656",
...
...
}]
在我的程序中,我確實是這樣的:
IList<DataItem> allItem = JsonConvert.DeserializeObject<IList<DataItem>>(myJsonArray);
這很好。
但是在我的情況下,json數組中大約有1000個數據(如Data1
到Data1000
來自數據庫。 而且我不想在我的類“ DataItem ”中定義1000個數據,例如:
public sealed class DataItem{
...
...
public string Data1 {get; set;}
public string Data2 {get; set;}
.
.
.
public string Data1000 {get; set;}
}
有什么方法可以使用一些動態類或對象來映射這1000個數據(從Data1到Data1000)來解決。
我正在考慮使用1000個長度的數組並像這樣映射它們,我知道這將行不通。
public sealed class DataItem{
public string UserId {get; set;}
public string TestId {get; set;}
public string[] Data {get; set;}
}
public DataItem(){
Data = new string[1000];
}
在我的程序中:
DataItem dataItem = new DataItem();
IList<DataItem> allItem = JsonConvert.DeserializeObject<IList<DataItem>>(myJsonArray);
PS我不能更改JSON數組的結構。
您可以嘗試一些不同的方法:
JObject obj = JObject.Parse(jsonString); // gets processed json object
DataItem item = new DataItem();
item.UserId = obj.SelectToken("UserId").Value<string>();
//.. fill rest of the data
string format = "Data{0}";
for(int i = 0; i < item.Data.Length; i++) // iterate through all Data[x]
{
item.Data[i] = obj.SelectToken(string.Format(format, i)).Value<string>();
}
您可以將其打包到一些類似的方法中:
public DataItem DeserializeFromJson(string json)
{
// put that code in here
}
編輯:
因此,問題(如您先前所述)是您有一個Json數組。 我的方法只是顯示熱從數組中讀取一個對象。
現在要弄清楚。 如果要反序列化數組,建議使用JsonConvert.DeserializeObject<T>()
方法DeserializeFromJson()
List<JObject>
輸入,然后使用我建議您從上面的代碼片段中進行JsonConvert.DeserializeObject<T>()
DeserializeFromJson()
方法。
結合這些,您可以實現以下目標:
public IEnumerable<DataItem> DeserializeListFromJson(string jsonArray)
{
return JsonConverter.DeserializeObject<List<JObject>>(jsonArray).Select( obj => DeserializeFromJson(obj) );
}
// updated
public DataItem DeserializeFromJson(JObject obj)
{
DataItem result = new DataItem();
item.UserId = obj.SelectToken("UserId").Value<string>();
//.. fill rest of the data
string format = "Data{0}";
for(int i = 0; i < item.Data.Length; i++) // iterate through all Data[x]
{
item.Data[i] = obj.SelectToken(string.Format(format, i)).Value<string>();
}
}
您可以使用字典來存儲來自JSON字符串的動態屬性數量。
以下是將問題中提供的JSON字符串成功轉換為字典列表的示例。 除了列表以外,您還可以轉換為字典數組。
var jsonData = "[{\"UserId\":\"5656\",\"TestId\":\"562\",\"UserName\":\"testuser\",\"Data1\":\"dang\",\"Data2\":\"phy\",\"Data3\":\"right\",\"Data4\":\"left\",\"Data5\":\"top\",\"Data6\":\"abc\",\"Data7\":\"rat\",\"Data8\":\"test\",\"Data9\":\"91\",\"Data10\":\"9090\"},{\"UserId\":\"8989\",\"TestId\":\"12\",\"UserName\":\"abc\",\"Data1\":\"111\",\"Data2\":\"222\",\"Data3\":\"Pwww\",\"Data4\":\"aaa\",\"Data5\":\"bbbb\",\"Data6\":\"cc\",\"Data7\":\"ooo\",\"Data8\":\"hh\",\"Data9\":\"g\",\"Data10\":\"5656\"}]";
var data = JsonConvert.DeserializeObject<List<Dictionary<string, string>>>(jsonData);
Console.WriteLine("Total : {0}", data.Count);
Console.WriteLine("Item1 Total : {0}", data[0].Count);
Console.WriteLine("Item2 Total : {0}", data[1].Count);
foreach(var item in data)
{
Console.WriteLine("--- Propertie start-----");
foreach(var kvPair in item)
{
Console.WriteLine("property name : {0}", kvPair.Key);
Console.WriteLine("property value : {0}", kvPair.Value);
}
Console.WriteLine("--- Propertie end-----");
}
Console.ReadLine();
這樣可以解決您的問題。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.