【问题标题】:split json string into its constituent 1st child nodes and put keys into string array将 json 字符串拆分为其组成的第一个子节点并将键放入字符串数组
【发布时间】:2014-12-01 16:51:14
【问题描述】:

我有一个 Json 文件,其中包含未知子节点,每个子节点都有未知深度的子节点。

我想将第一级子节点名称放入一个数组中。

如果我不知道他们的名字或子节点的数量,我该怎么做 - 即 json 结构是动态的?

例如json输入

{
"childNode1":"value", "childNode2":"value", "childNode3":"value", "childNode4":"value"
}

预期输出等价于这个数组:

string[] jsonArray =
     new[] { "childNode1", "childnode2", "childNode3", "childnode4" };

我的代码将向我显示调试器“本地”中的孩子,我如何获取他们的键和值?

JObject json = JObject.Parse(System.IO.File.ReadAllText(filePath));

如果我知道我正在寻找哪些节点,但我在这种情况下不知道,我可以做到吗?

【问题讨论】:

  • 你能发布预期的输入和输出吗?
  • 输入在 json 示例中,此示例 json 的输出是包含 1 级子键值的 4 元素字符串数组
  • JSON.Net 还是 JavaScriptSerializer?
  • @Fearghal 您的语法无效。我已经改了,如果你是这个意思,请告诉我们。
  • 道歉(切换到 c# 让我失望了)这正是我的意思。在现实生活中,这些节点中的每一个都可能有自己的孩子,但为简单起见,我排除了

标签: c# asp.net json


【解决方案1】:

如果将对象反序列化为字典,则可以轻松获取键。这是一个使用 Json.NET 的示例。

var dict = JsonConvert.DeserializeObject<Dictionary<string, object>>(s);
string[] jsonArray = dict.Keys.ToArray();

根据您要对对象执行的操作,第二行可能是多余的。

如果您已经将其作为JObject,您可以获得这样的名称:

JObject json = // something
string[] jsonArray = ((IDictionary<string, JToken>)json).Keys.ToArray(); // or
string[] jsonArray = json.Properties().Select(x => x.Name).ToArray();

【讨论】:

  • 我的 json 字符串应该放在哪里?
  • s 是你的 json 字符串。
  • 出错了,其中一个节点出错了,我不确定为什么 jsonserialiser 关心但....'解析值时遇到意外字符:C. 路径'',第 0 行,第 0 位。 '
  • 我创建了一个 JObject,我可以在我的调试器中看到它的子节点,一定有一种简单的方法可以从这里将子节点放入数组中? o更新了问题
  • 太棒了,这是一种享受,让我可以保留我的作业以供进一步检查。
【解决方案2】:

你可以的,

IEnumerable<string> ParsePropertyNames(string s)
{
    var o = JObject.Parse(s);
    return o.Properties().Select(p => p.Name);
}

你可以使用的,

var results = ParsePropertyNames(yourString).ToArray();

【讨论】:

  • 我如何处理“结果”?
  • 另外,我认为 yourstring 应该是 ParsePropertyNames 中的 s?
  • @Fearghal,这取决于你,它是一个字符串数组。
  • ParsePropertyNames 是一个函数,您可以将字符串传递给该函数,该字符串可能位于名为 yourString 的变量中。
  • 是的,所以在函数中你应该有 var o = JObject.Parse(yourString); = var o = JObject.Parse(s);其中 s 作为参数传入。
猜你喜欢
  • 2020-09-06
  • 1970-01-01
  • 2020-08-26
  • 2016-11-21
  • 1970-01-01
  • 2016-04-01
  • 2023-04-04
  • 1970-01-01
  • 2012-02-22
相关资源
最近更新 更多