首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >从包含多种类型的JSON对象中提取数组

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

Stack Overflow用户
提问于 2018-06-05 07:14:23
回答 1查看 594关注 0票数 0

(提醒一下,我对C#很陌生)

(参见下面的示例代码和JSON结构)

变量"response“只是原始的JSON数据。现在,我正在尝试找出如何将joTest“数据”放入DataTable中。也许我不应该使用数据表?

代码语言:javascript
复制
public void PerformFeed()
{
    string response;
    response = Blah.SendMessage().Result;

    JObject joTest = JsonConvert.DeserializeObject<JObject>(response);
}

Json数据结构

代码语言:javascript
复制
{
    "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语句来以这种方式填充数据表。它现在看起来非常inefficient...but,它可以工作了。希望我能找到更好的方法。

代码语言:javascript
复制
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"]);
    }
}
EN

回答 1

Stack Overflow用户

发布于 2018-06-05 07:26:34

有一个非常好的online utility可以帮助从JSON对象中提取C#类。我想问题出在你的JSON上,你漏掉了一个逗号",“。您可以通过一些online JSON formatter / validator很容易地发现错误。尝试以下操作:

代码语言:javascript
复制
JObject obtainedObject = JObject.Parse(JsonString);

下面是您获得的对象的结构:

代码语言:javascript
复制
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

代码语言:javascript
复制
JObject jObject = JObject.Parse(json);
JToken dataArray = jObject["data"];
DataTable dt = (DataTable) JsonConvert.DeserializeObject(dataArray.ToString(), (typeof(DataTable)));

为了避免多余的强制转换,您可以尝试使用上面已经提到的类结构执行以下操作:

代码语言:javascript
复制
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);
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50689981

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档