(只是抬头,我对C#很新)
(参见下面的示例代码和JSON结构)
我无法弄清楚如何从JSON响应中提取“数据”并将其放入数据表中。变量“response”只是原始的JSON数据。到目前为止,我已经想出如何将JSON解析为JObject ...所以现在它有两个成员(data,meta)。现在我想弄清楚如何将joTest [“data”]变成DataTable。我做过的一些尝试,在看到“元”成员时不断给我一个错误。也许我不应该使用数据表?
另外,如果它改变了什么,我不需要“数据”成员的“链接”。
我试过搜索“将JObject转换为数据表”但是我找不到很多有用的结果。
public void PerformFeed()
{
string response;
response = Blah.SendMessage().Result;
JObject joTest = JsonConvert.DeserializeObject<JObject>(response);
}
Json数据结构
{
"data": [
{
"Val1": "1234",
"Val2": "foo1",
"Val3": "bar1",
"links": [
{
"rel": "self",
"uri": "/blah/1234"
},
{
"rel": "pricing_data",
"uri": "/blah/1234/pricing_data"
}
]
},
{
"Val1": "5678",
"Val2": "foo2",
"Val3": "bar2",
"links": [
{
"rel": "self",
"uri": "/blah/5678"
},
{
"rel": "pricing_data",
"uri": "/blah/5678/pricing_data"
}
]
}
],
"meta": {
"pagination": {
"total": 2,
"count": 2,
"per_page": 25,
"current_page": 1,
"total_pages": 1,
"links": []
}
}
}
更新:我已经找到了一个“解决方案”,但我真的不认为这是一个很好的解决方案。我构建了一个数据表,然后在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"]);
}
}
答案 0 :(得分:1)
有一个非常好的online utility可以帮助从JSON对象中提取C#类。我认为这里的问题是你的JSON,你错过了一个逗号“,”。您可以轻松地通过某些online JSON formatter / validator发现错误。休息反序列化非常简单。请尝试以下方法:
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; }
}
更新
以下是如何提取数组并将其转换为 DataTable :
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);
}