如何对 json 数组中的对象进行寻址



使用 JSON 库,我导入了一个对象数组:

dynamic serviceList = JsonConvert.DeserializeObject(listString)

我有一个 json 对象的数组,每个对象都有属性"name"。

[
{
"name":"abcd",
"properties":{
"type":"1234"
}
},
{
"name":"xyz",
"properties":{
"type":"aaaa"
}
}
]

如何仅处理对象"abcd"?

您可以使用Newtonsoft.JsonJArray.Parse()函数解析json数组。

使用FirstOrDefault()获取名称为"abcd"的记录

string listString = @"[{'name': 'abcd','properties': {'type': '1234'}},{'name': 'xyz', 'properties': { 'type': 'aaaa'}}]";
JArray jArray = JArray.Parse(listString);
//FirstOrDefault to get first record which satisfy the condition
var result = jArray.FirstOrDefault(x => (string)x["name"] == "abcd");
Console.WriteLine(result);

输出:

{
"name": "abcd",
"properties": {
"type": "1234"
}
}

.Net Fiddle

解决问题的正确方法是创建一个静态对象

Public Obj1 {
public string name {get;set;}
public Properties properties {get;set;}
}
Public Properties {
public string type {get;set;}
}

然后你可以将JSON反序列化为List<Obj1>,这样你可以迭代你的列表并找到"name":"abcd"对象。var myobj = mylist.FirstOrDefault(x=> x.name == "abcd")

您可以使用动态来执行几乎任何您希望它执行的操作,因此没有什么可以阻止您通过以下方式评估结果:

dynamic selectionList = JsonConvert.DeserializeObject( json );
foreach (var item in selectionList) {
if ( string.Equals( (string)item.name, "abcd", StringComparison.OrdinalIgnoreCase ) ) {
Console.WriteLine( item );
}
}

这将按照您最初的要求工作,但我认为您正在使自己比需要:)困难得多

要了解它是如何工作的,你可以检查这个dotnetfiddle

我可能会根据规范创建一个类,但我假设属性是属性及其值的动态列表,这意味着您最终仍然会得到一个Dictionary<string, object>

您可以像这样访问它:

for (int i = 0; i < serviceList.Count; i++)
{
if (serviceList[i].name == "abc")
{
DoSomethingWith(serviceList[i];
break;
}
}

编辑:没有看到你想要"abc"元素,所以相应地修改了代码。

这将为您获取 JObject 的值,您可以从中访问包含的值:

var serviceList = JArray.Parse(listString);
var target = serviceList.Single(s => s["name"].ToString() == "abcd");
if (target != null)
{
var type = target["properties"]["type"];
// etc
}

最新更新