C#Json将任何动态对象转换为键值对

C#Json将任何动态对象转换为键值对,c#,json,dynamic,json.net,C#,Json,Dynamic,Json.net,我正在编写一个工具,它将接收一个入站Json对象,并将其转换为 键值记录(有时可能称为扁平化)。这样做的目的是避免工具在获取非常大或非常嵌套的Json对象时崩溃,因此我希望避免递归 一个示例对象可能是这样的(如下所示),包含嵌套数组、空值,您可以随意命名,字面上是任何合法的json { "firstName": "John", "lastName": "Smith", "isAlive": true, "age": 25, "address": { "streetAd

我正在编写一个工具,它将接收一个入站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);
我相信您将能够在路径中进行
替换。

尝试以下操作:

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”);若要删除方括号,请使用简单字符串替换“.”作为分隔符,其中分隔符是由用户选择的类似正斜杠的字符。回答得很好,非常感谢,希望它也能帮助其他人。如何在结果对象中识别行和列?