从 JSON 数组读取特定数据



我有这样的json表,我如何尝试特定数据?

var json_str={ "table1":[
{"name1":"data1"},
{"name2":"data2"},
{"name3":"data3"}
],
"table2":[
{"name1":"data1"},
{"name2":"data2"},
{"name3":"data3"}
]
}   
dynamic stuff = JsonConvert.DeserializeObject(json_string); 
//I'd like attempt to data like this(for example)
var abc=stuff.table1["name1"];

这显然是错误的,但是有什么方法可以按名称调用 JSON 表的内容吗?

已解决:我将 json 更改为

var json_str={ "table1":{
"name1":"data1",
"name2":"data2",
"name3":"data3"
},
"table2":{
"name1":"data1",
"name2":"data2",
"name3":"data3"
}
} 
var abc=JsonConvert.DeserializeObject<Form1.RootObject>(json_str);  

现在我通过以下方式尝试(例如(:abc.table1.name2;

非常感谢 xdtTransform 和大家的提示。

只需使用点表示法。

工作示例:

using System;
using System.Collections.Generic;
using Newtonsoft.Json;
public class Program
{
public static void Main()
{
var json_str = "{ "table1":[{"name1":"data1"},{"name2":"data2"},{"name3":"data3"}],"table2":[{"name1":"data1"},{"name2":"data2"},{"name3":"data3"}]}";
dynamic stuff = JsonConvert.DeserializeObject(json_str);
Console.WriteLine(stuff.table2[0].name1); // prints "data1"
}
}

另类:

stuff["table2"][0]["name1"]

为什么你的不工作:

var abc=stuff.table1["name1"];

您不能直接访问"name1",因为它位于对象数组中。获取第一个带有 [0] 的元素,然后您可以访问 name1。

为什么不将 Json 反序列化为强类型对象,如以下示例所示

class Program
{
static void Main(string[] args)
{
var json_str = "{ table1:[{name:'data1'}," +
"{name:'data2'},{name:'data3'}]," +
"table2:[{name:'data1'},{name:'data2'},{name:'data3'}]}";
var collection = JsonConvert.DeserializeObject<TableCollectionObject>(json_str);
foreach (var item in collection.table1)
{
Console.WriteLine(item.name);
}
foreach (var item in collection.table2)
{
Console.WriteLine(item.name);
}
Console.ReadLine();
}
}
class TableCollectionObject
{
public ICollection<SingleTableObject> table1 { get; set; }
public ICollection<SingleTableObject> table2 { get; set; }
}
class SingleTableObject
{
public string name { get; set; }
}

请注意,我已经将您的 Json 更改为一个有效的 json 对象,可以由 Newtonsoft.Json 库解析。

A.JObject.Parse

JObject o = JObject.Parse(json);
var name = o["table1"][0]["name1"].Value<string>();// data1
var name2 = o["table2"][2]["name3"].Value<string>();// data3

二.DicstionaryListDictionary

var d = System.Text.Json.JsonSerializer.Deserialize<Dictionary<string,List<Dictionary<string,string>>>>(json);
var nameB = d["table1"][0]["name1"]; // data1
var nameB2 = d["table2"][2]["name3"]; // data3

这是我使用的测试数据。

var json = @"{ ""table1"":[
{""name1"":""data1""},
{""name2"":""data2""},
{""name3"":""data3""}
],
""table2"":[
{""name1"":""data1""},
{""name2"":""data2""},
{""name3"":""data3""}
]
}";

这是一种常见的数据结构,因为数组中的第一项具有一个名为name1的属性,而第 2 项具有一个名为name2的单个属性。

更常见的架构如下所示。

{
"table1": [
{
"name1": "data1", "name2": "data2", "name3": "data3",
},
{
"name1": "data1", "name2": "data2", "name3": "data3"
}
]
}

最新更新