Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/266.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 从包含多个类型的JSON对象提取数组_C#_Arrays_Json - Fatal编程技术网

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

C# 从包含多个类型的JSON对象提取数组,c#,arrays,json,C#,Arrays,Json,(只是提醒一下,我对C很陌生) (参见下面的示例代码和JSON结构) 我不知道如何从JSON响应中提取“数据”并将其放入数据表中。变量“response”只是原始JSON数据。到目前为止,我已经知道了如何将JSON解析成一个JObject……所以现在它有两个成员(数据、元数据)。现在,我正试图找出如何将joTest[“data”]放入数据表中。我做了几次尝试,当它看到“meta”成员时,总是给我一个错误。也许我不应该使用数据表 另外,如果它改变了什么,我不需要来自“数据”成员的“链接” 我尝试过

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

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

我不知道如何从JSON响应中提取“数据”并将其放入数据表中。变量“response”只是原始JSON数据。到目前为止,我已经知道了如何将JSON解析成一个JObject……所以现在它有两个成员(数据、元数据)。现在,我正试图找出如何将joTest[“data”]放入数据表中。我做了几次尝试,当它看到“meta”成员时,总是给我一个错误。也许我不应该使用数据表

另外,如果它改变了什么,我不需要来自“数据”成员的“链接”

我尝试过搜索“将JObject转换为数据表”,但没有找到很多有用的结果

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