【问题标题】:Dynamic loading of JSON file, and all of its contents with C#使用 C# 动态加载 JSON 文件及其所有内容
【发布时间】:2021-11-15 09:27:28
【问题描述】:

最近我开始研究 JSON 解析,我想知道,是否有可能完全动态加载 JSON 文件中的所有内容?通过动态加载,我的意思是在不知道任何键的情况下加载 JSON 文件的所有值,这意味着我无法执行以下代码:

string contents = File.ReadAllText("SomeJsonFile.txt");
JObject obj = JObject.Parse(contents);
var value = obj["SomeKey"];

我不能执行上面的代码的原因是因为这需要应用程序提前知道密钥。

我的目标是能够加载任何 JSON 文件,并从所述 JSON 文件中检索所有值。我希望能够在不知道键的情况下加载嵌套值以及根值。 我有办法做到这一点吗?如果您需要更多信息,请随时询问。

我想使用这些数据的方式是首先将一个文本框绑定到每个键的字符串版本。然后我将动态添加 TextBoxes 到 FlowLayoutPanel,我还希望用户能够更改此数据,并且 JSON 也随之更改。

请帮忙。

【问题讨论】:

  • 听起来您打算将嵌套结构展平为列表。这是真的还是您打算保留嵌套结构?
  • 你已经完成了。您在不知道键的情况下将 json 动态加载到 JObject 中。
  • @SeanMissingham 我打算展平嵌套结构
  • 同意 Alexander 的观点,您已经获得了一个动态加载所有数据的对象。您正在寻找的是一种递归展平 JObject 的方法。我会更新我的答案
  • 试试obj.Properties().Select(p => p.Name)

标签: c# json


【解决方案1】:

如果您不知道您将拥有什么键,您可以使用 Json.NET 中的 JArray 来动态访问该类。

在此处的答案中查看示例实例化和用法:

How to access elements of a JArray (or iterate over them)

【讨论】:

  • 虽然我同意使用 Newtonsoft,因为他们明确表示“不知道密钥”,然后反序列化为知名类的实例并不是正确的答案。
  • @LasseV.Karlsen,你的权利,我没有看到那部分。我已经改变了我的答案以反映这一点。你能检查一下这次是否正确吗?
  • OP 已经展示了一个将 JSON 文件解析为动态对象的工作示例。我认为缺少的部分是他们打算如何使用它。
  • @SeanMissingham 我编辑了问题并添加了我打算使用数据的方式。
【解决方案2】:

假设 JSON 是一个对象而不是数组,您可以使用 Json.NET 将 json 字符串反序列化为 IDictionary<string, object>

string myJsonString = File.ReadAllText("SomeJsonFile.txt");
var dataObj = JsonConvert.DeserializeObject<IDictionary<string, object>>(myJsonString);

var topLevelKeys = dataObj.Keys;

您的原始问题已经表明您已成功地将 JSON 字符串解析为 C# 对象,而无需知道密钥。

看来您的实际问题是如何将 JObject 展平为某种可枚举的键/值对集。为此,我建议您参考此线程上的答案: Generically Flatten Json using c#

Answer 2 IMO 看起来干净多了:

string contents = File.ReadAllText("SomeJsonFile.txt");
var schemaObject = JObject.Parse(contents);
var values = schemaObject
    .SelectTokens("$..*")
    .Where(t => !t.HasValues)
    .ToDictionary(t => t.Path, t => t.ToString());

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-11-16
    • 1970-01-01
    • 2017-12-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多