![](/img/trans.png)
[英]C# Json Convert any dynamic object to key value pairs not class
[英]C# Json Convert any dynamic object to key value pairs
我正在编写一个工具,该工具将使用入站Json对象,并将其转换为键值记录(有时称为“展平”)。 目的是避免在工具变得很大或嵌套的Json对象时导致工具损坏,因此我想避免递归。
一个示例对象可能像这样(下),包含嵌套数组,空值,您可以为其命名,实际上是任何合法的json ...
{
"firstName": "John",
"lastName": "Smith",
"isAlive": true,
"age": 25,
"address": {
"streetAddress": "21 2nd Street",
"city": "New York",
"state": "NY",
"postalCode": "10021-3100"
},
"phoneNumbers": [
{
"type": "home",
"number": "212 555-1234"
},
{
"type": "office",
"number": "646 555-4567"
},
{
"type": "mobile",
"number": "123 456-7890"
}
],
"children": [],
"spouse": null
}
上面对象的期望输出将是该对象每个元素的键值对...
Key Value
/firstName "John"
/lastName "Smith"
/isAlive "true"
/age "25"
/address
/address/streetAddress "21 2nd Street"
/address/city "New York"
/address/state "NY"
/address/postalCode "10021-3100"
/phoneNumbers
/phoneNumbers/1/
/phoneNumbers/1/type "home"
/phoneNumbers/1/number "212 555-1234"
/phoneNumbers/2/
/phoneNumbers/2/type "office"
/phoneNumbers/2/number "646 555-4567"
/phoneNumbers/3/
/phoneNumbers/3/type "mobile"
/phoneNumbers/3/number "123 456-7890"
/children
/spouse
我上面的示例对象在内存中是一个动态对象,使用Newtonsoft的JSON类导入。 仅重申一下,理想的解决方案将不涉及递归,因为吹散的堆栈会很不好。 感谢您的帮助。
尝试这个:
var json = File.ReadAllText("test.txt");
var obj = JObject.Parse(json);
var result = obj.Descendants()
.OfType<JProperty>()
.Select(p => new KeyValuePair<string, object>(p.Path,
p.Value.Type == JTokenType.Array || p.Value.Type == JTokenType.Object
? null : p.Value));
foreach (var kvp in result)
Console.WriteLine(kvp);
它为您提供:
[firstName, John]
[lastName, Smith]
[isAlive, True]
[age, 25]
[address, ]
[address.streetAddress, 21 2nd Street]
[address.city, New York]
[address.state, NY]
[address.postalCode, 10021-3100]
[phoneNumbers, ]
[phoneNumbers[0].type, home]
[phoneNumbers[0].number, 212 555-1234]
[phoneNumbers[1].type, office]
[phoneNumbers[1].number, 646 555-4567]
[phoneNumbers[2].type, mobile]
[phoneNumbers[2].number, 123 456-7890]
[children, ]
[spouse, ]
我相信您将能够在路径中进行Replace
。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.