我有下面的Json数组,我需要在我的"关系";对象我该怎么做?对于数组中的每个对象,relation对象具有不同的键值对集。
[
{
"data": {
"_hash": null,
"kind": "ENTITY",
"id": "test122",
"payload": {
"attributes": {
"bbl:27": false
},
"relations": {
"bbl:45": "P18",
"bbl:P18": "P562"
},
"type": [
"P185"
]
}
}
}
]
在上述内部关系中,键是";bbl:45〃;以及";bbl:P18〃;。我需要这些值,特别是我需要提取45和P18,考虑到bbl在关系对象内部保持不变。我该怎么做。Jarray中有多个对象,我只展示了一个。
我想说的是,如果你可以更改数据格式,请考虑这样做,将有效载荷作为成员专有名称的一部分是非常不寻常的,但你可以这样做:
[Fact]
public void DynamicJsonHandlingTest()
{
var serialized = "[{"data":{"_hash":null,"kind":"ENTITY","id":"test122","payload":{"attributes":{"bbl:27":false},"relations":{"bbl:45":"P18","bbl:P18":"P562"},"type":["P185"]}}}]";
using var jDoc = JsonDocument.Parse(serialized);
var enumerator = jDoc.RootElement.EnumerateArray();
foreach(var JsonElement in enumerator)
{
var relationsElement = JsonElement.GetProperty("data").GetProperty("payload").GetProperty("relations");
foreach (var ele in relationsElement.EnumerateObject())
{
var sought = ele.Name.Split(":")[1];
//sought now cointains first 45 then P18
}
}
}
下面的代码解决了您的问题。
using Newtonsoft.Json.Linq;
using System;
using System.Linq;
using Json.Net;
namespace ConsoleApp1
{
class Program
{
static void Main(string[] args)
{
string json = "{"data":{"_hash":null,"kind":"ENTITY","id":"test122","payload":{"attributes":{"bbl:27":false},"relations":{"bbl:45":"P18","bbl:P18":"P562"},"type":["P185"]}}}";
JObject jsonObject = JObject.Parse(json);
var results = jsonObject["data"]["payload"]["relations"];
foreach (var item in results)
{
string propName = ((JProperty)item).Name;
string requiredValue = propName.Split(':')[1];
Console.WriteLine($"Required: {requiredValue} !");
}
}
}
}
当属性名称不包含:
时,您应该添加一些错误处理
对于动态键,可以使用dictionary:
public class Root
{
public Data data { get; set; }
}
public class Data
{
public Payload payload { get; set; }
}
public class Payload
{
public Dictionary<string, string> relations { get; set; }
}
var result = JsonConvert.DeserializeObject<List<Root>>(sourcejson);
然后接下来将包含所有密钥:
var keys = result
.Select(r => r.data)
.Select(r => r.payload)
.SelectMany(r => r.relations.Keys)
或者使用LINQ to JSON API:
var result = JsonConvert.DeserializeObject<JArray>(sourcejson);
var list = result
.Children()
.SelectMany(c => c["data"]["payload"]["relations"].Children<JProperty>())
.Select(p => p.Name)
.ToList(); // list is {"bbl:45", "bbl:P18"}
然后您可以根据需要处理密钥,例如使用Split(':')
将"bbl:45"
转换为"bbl"
和"的数组;45〃;。