C# 使用Newtonsoft JSON.net在c中反序列化JSON对象
我有JSON数组。我想把它映射/反序列化到下面的类中C# 使用Newtonsoft JSON.net在c中反序列化JSON对象,c#,arrays,json,json.net,windows-10-universal,C#,Arrays,Json,Json.net,Windows 10 Universal,我有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;} publi
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数组:
在我的节目中,我喜欢这样:
IList<DataItem> allItem = JsonConvert.DeserializeObject<IList<DataItem>>(myJsonArray);
有没有办法解决这个问题,使用一些动态类或对象将这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);
另外,我无法更改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>();
}
编辑:
因此,正如您前面所说,问题在于您有一个Json数组。我的方法只是显示hot以从数组中读取一个对象
现在让我们把事情弄清楚。若你们想反序列化一个数组,我建议你们使用JsonConvert.DeserializeObject方法将输入反序列化到列表中,然后使用我建议你们根据上面的代码片段制作的DeserializeFromJson方法
结合这些,您可以实现以下目标:
IList<DataItem> allItem = JsonConvert.DeserializeObject<IList<DataItem>>(myJsonArray);
您可以使用字典来存储来自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();
这将解决您的问题。您可以使用动态对象而不是DataItem类吗?JsonConvert.DeserializeObjectmyJsonArray;?您可以这样做:dynamic data=Json.Decodejson;嗨@m.rogalski,我也试过了。但在分析第一行中的JSON数组时出现异常。@KishorBikramOli请阅读更新的答案并给我一些反馈。
public DataItem DeserializeFromJson(string json)
{
// put that code in here
}
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>();
}
}
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();