从包含多个类型的JSON对象中提取数组

时间:2018-06-04 23:14:23

标签: c# arrays json

(只是抬头,我对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"]);
    }
}

1 个答案:

答案 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);
}