C# 从包含多个类型的JSON对象提取数组
(只是提醒一下,我对C很陌生) (参见下面的示例代码和JSON结构) 我不知道如何从JSON响应中提取“数据”并将其放入数据表中。变量“response”只是原始JSON数据。到目前为止,我已经知道了如何将JSON解析成一个JObject……所以现在它有两个成员(数据、元数据)。现在,我正试图找出如何将joTest[“data”]放入数据表中。我做了几次尝试,当它看到“meta”成员时,总是给我一个错误。也许我不应该使用数据表 另外,如果它改变了什么,我不需要来自“数据”成员的“链接” 我尝试过搜索“将JObject转换为数据表”,但没有找到很多有用的结果C# 从包含多个类型的JSON对象提取数组,c#,arrays,json,C#,Arrays,Json,(只是提醒一下,我对C很陌生) (参见下面的示例代码和JSON结构) 我不知道如何从JSON响应中提取“数据”并将其放入数据表中。变量“response”只是原始JSON数据。到目前为止,我已经知道了如何将JSON解析成一个JObject……所以现在它有两个成员(数据、元数据)。现在,我正试图找出如何将joTest[“data”]放入数据表中。我做了几次尝试,当它看到“meta”成员时,总是给我一个错误。也许我不应该使用数据表 另外,如果它改变了什么,我不需要来自“数据”成员的“链接” 我尝试过
public void PerformFeed()
{
string response;
response = Blah.SendMessage().Result;
JObject joTest = JsonConvert.DeserializeObject<JObject>(response);
}
更新:我已经想出了一个“解决方案”,但我真的认为这不是一个好的解决方案。我构建了一个datatable,然后在JObject上使用foreach语句以这种方式填充数据表。它看起来效率很低……但现在它起作用了。希望我能找到更好的方法
public void PerformFeed()
{
DataTable Items = new DataTable();
Items.Columns.Add("Val1");
Items.Columns.Add("Val2");
Items.Columns.Add("Val3");
string response = Blah.SendMessage().Result;
JObject Data = JObject.Parse(response);
foreach (JObject jo in Data["data"])
{
Items.Rows.Add(jo["Val1"], jo["Val2"], jo["Val3"]);
}
}
有一个非常好的方法可以帮助从JSON对象中提取C#类。我认为这里的问题在于JSON,缺少了一个逗号“,”。你可以很容易地发现一些错误。其余部分的反序列化非常简单。请尝试以下操作:
JObject obtainedObject = JObject.Parse(JsonString);
以下是您获得的对象的结构:
public class RequiredClass
{
public IList<Datum> data { get; set; }
public Meta meta { get; set; }
}
public class Datum
{
public string Val1 { get; set; }
public string Val2 { get; set; }
public string Val3 { get; set; }
public IList<Link> links { get; set; }
}
public class Link
{
public string rel { get; set; }
public string uri { get; set; }
}
public class Pagination
{
public int total { get; set; }
public int count { get; set; }
public int per_page { get; set; }
public int current_page { get; set; }
public int total_pages { get; set; }
public IList<object> links { get; set; }
}
public class Meta
{
public Pagination pagination { get; set; }
}
为了避免多余的强制转换,可以使用上面提到的类结构尝试以下操作:
JObject jObject = JObject.Parse(json);
JToken dataArray = jObject["data"];
List<Datum> requiredList = new List<Datum>();
foreach (var item in dataArray)
{
Datum obj = new Datum();
obj.Val1 = (string) item["Val1"] ?? "";
obj.Val2 = (string) item["Val2"] ?? "";
obj.Val3 = (string) item["Val3"] ?? "";
obj.links = new List<Link>();
foreach(var subItem in item["links"])
{
Link lnk = new Link();
lnk.rel = (string) subItem["rel"] ?? "";
lnk.uri = (string) subItem["uri"] ?? "";
obj.links.Add(lnk);
}
requiredList.Add(obj);
}
JObject-JObject=JObject.Parse(json);
JToken dataArray=jObject[“数据”];
List requiredList=新列表();
foreach(数据数组中的变量项)
{
基准obj=新基准();
obj.Val1=(字符串)项[“Val1”]??“”;
obj.Val2=(字符串)项[“Val2”]??“”;
obj.Val3=(字符串)项[“Val3”]??“”;
obj.links=新列表();
foreach(项[“链接”]中的var子项)
{
链接lnk=新链接();
lnk.rel=(字符串)子项[“rel”]??“”;
lnk.uri=(字符串)子项[“uri”]??“”;
对象链接添加(lnk);
}
所需列表。添加(obj);
}
“少量尝试…”,显示您的最佳尝试和错误。@blins我最近的尝试与上面的代码相同,但在“DataSet dtTest=JsonConvert.DeserializeObject(response);”行中交换。运行该命令时,我得到一个错误,上面写着“读取DataTable时出现意外的JSON令牌。应为StartArray,应为StartObject。路径‘meta’”。我明白我为什么会犯这个错误…但我不知道如何避免它。我试着跟随这篇文章:我将反序列化为动态-works v nicelySorry,我修正了打字错误。那是我的错。我在发布之前手动修改了JSON中的数据,因为我使用的API正在返回信息,我不允许将该信息公开。问题是试图将“data”成员放入datatable中,以便我可以使用不同的API为每个列表项附加额外的“columns”/信息。另外,感谢您提供的链接,这些将在将来非常有用。@chadwin我明白了,请检查更新的答案。让我知道它是否解决了这个问题。啊,非常有趣……因此,您将整个内容解析为一个jObject,然后提取“data”成员,然后将其转换回字符串,并将其重新解析为一个数据表。
JObject jObject = JObject.Parse(json);
JToken dataArray = jObject["data"];
DataTable dt = (DataTable) JsonConvert.DeserializeObject(dataArray.ToString(), (typeof(DataTable)));
JObject jObject = JObject.Parse(json);
JToken dataArray = jObject["data"];
List<Datum> requiredList = new List<Datum>();
foreach (var item in dataArray)
{
Datum obj = new Datum();
obj.Val1 = (string) item["Val1"] ?? "";
obj.Val2 = (string) item["Val2"] ?? "";
obj.Val3 = (string) item["Val3"] ?? "";
obj.links = new List<Link>();
foreach(var subItem in item["links"])
{
Link lnk = new Link();
lnk.rel = (string) subItem["rel"] ?? "";
lnk.uri = (string) subItem["uri"] ?? "";
obj.links.Add(lnk);
}
requiredList.Add(obj);
}