我想对一些json进行通用的扁平化,这样我就可以转换成一个数据表,并使用c#绑定到一个数据网格
什么是最好的方式doign它,铭记我不知道有多少水平,我下去?
例如
{
"appointmentid": 4,
"policyid": 1,
"guid": "00000000-0000-0000-0000-000000000000",
"number": "1234567890",
"ampm": "false",
"date": "2015-09-08T00:00:00",
"vehicle": {
"id": 1,
"guid": "00000000-0000-0000-0000-000000000000",
"make": null,
"model": null
},
"installer": {
"installerid": "1",
"name": "Installer 1",
"contact": "qwerty",
"qascore": "0",
"address1": "qwerty",
"address2": "qwerty",
"address3": null,
"address4": null,
"city": "qwertyu",
"county": "qwertyu",
"postcode": "asdfghj",
"country": "GB",
"email": "asdfghj",
"web": "asdfghjk",
"archived": false
},
"installations": [
{
"installationid": 6,
"installationstatus": {
"installationstatusid": 4,
"installationstatus": "FAIL"
},
"isactive": true
},
{
"installationid": 7,
"installationstatus": {
"installationstatusid": 1,
"installationstatus": "NEW"
},
"isactive": false
}
],
"archived": false
}
我想扩展这个(我想我可以迭代我转换的数据表),而不是installations.1.installationid,我会得到installationid1。
由于我将在网格中显示结果数据表,因此我希望保持列名友好。
8条答案
按热度按时间8gsdolmq1#
你可以使用Json.Net的LINQ-to-JSON API将数据解析为
JToken
结构。从那里,你可以使用递归帮助方法来遍历结构并将其扁平化为Dictionary<string, object>
,其中键是原始JSON中每个值的“路径”。我会这样写:在JSON中使用这个
DeserializeAndFlatten
方法,你最终会得到这样的键值对:如果你想让按键更人性化,你可以使用一点字符串操作来减少它们。也许是这样的:
这会给予你这样的输出:
但请注意,在这种安排下,您丢失了一些上下文:例如,您可以看到现在有两个相同的
archived
键,而在原始JSON中,它们是不同的,因为它们出现在层次结构的不同部分(installer.archived
与archived
)。您需要自己解决这个问题。小提琴:https://dotnetfiddle.net/gzhWHk
uwopmtnx2#
使用库Json.Net您可以使用JSONPath
$..*
来获取JSON结构的所有成员,并过滤掉没有子成员的成员以跳过容器属性。例如
wf82jlnq3#
另一个变体使用Newtonsoft的Json.NET LINQ to JSON作为根目录下的对象(同样也可以使用
JArray
):31moq8wy4#
我也在寻找一个解决方案,它为我做了这项工作。使用新的C# 7 Tupels作为结果集。如果有人有另一个轻量级的解决方案,我很感兴趣:-)
https://jsonplaceholder.typicode.com/users的结果:
5fjcxozz5#
下面是使用Cinchoo ETL将JSON /转换为DataTable的另一种方法
展平JSON:
JSON转DataTable:
drkbr07n6#
反序列化,然后LINQ选择flatten。我猜,既然你没有说明,你想让所有的约会和安装信息与特定的安装在同一个记录上?
我最初的想法是利用dynamics,这样你就可以避免为你的JSON放入静态模式。如果你已经有了可以充当JSON模式的静态类型,那么你就可以避免dynamics(以及它所需要的一切)。下面是一个示例类-使用JSON.NET -来说明我的想法:
你可以测试代码:
ha5z0ras7#
对于那些在F#中需要相同的人:
g9icjywg8#
我今天需要将一些JSON加载到一个键/值列表中,并决定使用.NET中的Microsoft配置“Microsoft.Extensions.Configuration”:
现在JSON被加载并parset到IConfiguration中,然后使用以下方法将其放入键/值对列表中就很简单了:
并将结果写入控制台:
结果是这样的:“level 0:level 1:level2 ==这是值”