C#Json将任何动态对象转换为键值对
我正在编写一个工具,它将接收一个入站Json对象,并将其转换为 键值记录(有时可能称为扁平化)。这样做的目的是避免工具在获取非常大或非常嵌套的Json对象时崩溃,因此我希望避免递归 一个示例对象可能是这样的(如下所示),包含嵌套数组、空值,您可以随意命名,字面上是任何合法的jsonC#Json将任何动态对象转换为键值对,c#,json,dynamic,json.net,C#,Json,Dynamic,Json.net,我正在编写一个工具,它将接收一个入站Json对象,并将其转换为 键值记录(有时可能称为扁平化)。这样做的目的是避免工具在获取非常大或非常嵌套的Json对象时崩溃,因此我希望避免递归 一个示例对象可能是这样的(如下所示),包含嵌套数组、空值,您可以随意命名,字面上是任何合法的json { "firstName": "John", "lastName": "Smith", "isAlive": true, "age": 25, "address": { "streetAd
{
"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);
我相信您将能够在路径中进行替换。尝试以下操作:
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);
我相信您将能够在路径中进行Replace
。Nuget软件包newtonsoft json是否有帮助?听起来好像他们已经为您编写了工具。如果您在JSON中使用递归来破坏堆栈,我会说JSON比破坏堆栈更糟糕。不管怎么说,我在你的问题中没有看到任何代码,没有任何迹象表明你自己做了什么,而且感觉你在要求我们为你写一段代码…@Aaron.S-是的,我正在使用它。我将字符串转换为动态对象,但对象结构未知,因此问题是如何访问动态json对象的每个节点。谢谢你的帖子。@oerkelens-这不是我的Json,这是一个转换任何未知Json的工具。使用递归将使工具用户面临堆栈溢出。这也是恶意攻击的弱点。我明白了,你们认为我是在试图骗取一些免费的代码,但事实上,我被困在了如何遍历动态json对象上。我会通过反复试验找出答案,但我认为这样的帖子会给我一些线索。我当前的代码只是将字符串加载到Json对象(dynamic parsedJsonObject=Newtonsoft.Json.JsonConvert.DeserializeObject(Json);)。问:如何行走这个物体…@oerkelens继续话题。您的“一段代码投诉”是不必要的。Nuget软件包newtonsoft json是否有帮助?听起来好像他们已经为您编写了工具。如果您在JSON中使用递归来破坏堆栈,我会说JSON比破坏堆栈更糟糕。不管怎么说,我在你的问题中没有看到任何代码,没有任何迹象表明你自己做了什么,而且感觉你在要求我们为你写一段代码…@Aaron.S-是的,我正在使用它。我将字符串转换为动态对象,但对象结构未知,因此问题是如何访问动态json对象的每个节点。谢谢你的帖子。@oerkelens-这不是我的Json,这是一个转换任何未知Json的工具。使用递归将使工具用户面临堆栈溢出。这也是恶意攻击的弱点。我明白了,你们认为我是在试图骗取一些免费的代码,但事实上,我被困在了如何遍历动态json对象上。我会通过反复试验找出答案,但我认为这样的帖子会给我一些线索。我当前的代码只是将字符串加载到Json对象(dynamic parsedJsonObject=Newtonsoft.Json.JsonConvert.DeserializeObject(Json);)。问:如何行走这个物体…@oerkelens继续话题。你的“代码投诉”是不必要的,这太完美了!为了帮助那些来这里寻找完整答案的人,我必须添加Newtonsoft.Json.Linq和System.Linq的using语句。我还必须使用Regex.Replace(键“\[(\\d+)\]”,分隔符+“$1”);若要删除方括号,请使用简单字符串替换“.”作为分隔符,其中分隔符是由用户选择的类似正斜杠的字符。回答得很好,非常感谢,希望它也能帮助其他人。如何在结果对象中识别行和列?这太完美了!为了帮助那些来这里寻找完整答案的人,我必须添加Newtonsoft.Json.Linq和System.Linq的using语句。我还必须使用Regex.Replace(键“\[(\\d+)\]”,分隔符+“$1”);若要删除方括号,请使用简单字符串替换“.”作为分隔符,其中分隔符是由用户选择的类似正斜杠的字符。回答得很好,非常感谢,希望它也能帮助其他人。如何在结果对象中识别行和列?