【发布时间】:2019-09-11 17:03:28
【问题描述】:
我有一个名为 name.json 的 Json 文件 可以在下面看到这样一个 Json 文件的示例
{
"set": 5,
"low": 0,
"draw_set": "0.1 up to 0.3",
"Wupet": "Hold",
"": null
}
但也有可能是其他时候 Json 文件有另一个结构。
{
"set": 5,
"low": 0,
"draw_set": "0.1 up to 0.3",
"W_set": "Ramp 1.5 ∞C/min",
"Wset": 0,
"Wupet": "Hold",
"": null
}
我想将此 Json 文件的输入(每个文件中的属性及其类型可能不同)转换为 C 结构,其中结构会自动检测 Json 文件中有哪些属性(及其类型)。 “”中的属性“”:null(可以给随机属性名)
然后我想自动将Json值的值赋给对象Book1的结构体。
我的代码计划
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
struct Books {
float set[50];
int low[50];
char draw_set[100];
char Wupet[100];
};
int main( ) {
/* Read name.Json file */
struct Books Book1; /* Declare Book1 of type Book */
/* Convert content Json to Struct Book1 with it's actual values*/
return 0;
}
编辑: 如果 Json 文件中存在“Wset”和“W_set”键,我不想忽略它们。 Json 文件的键随时都在改变(未来可能会出现许多未知属性)。钥匙的数量不能保证。保证“多行拆分”属性?应为空键名称指定一个随机名称(可以出现多个键,如空键名称) 应自动检测和创建结构的属性类型。 Json 文件包含单个记录(对象)
我想在运行时处理这些结构。
【问题讨论】:
-
好的;这是一个好的开始。现在,你接下来要做什么? (我们将帮助您解决您发现的问题;我们不会简单地为您做作业或编写代码。)。您打算忽略
"Wset"和"W_set"键吗?键的顺序是否有保证?密钥数量是否有保证?是否保证了“多行拆分”属性?键名为空的字段需要做什么? -
您可以创建自己的函数来读取 json 文件(这有点复杂),也可以使用任何现有的 C 库来读取文件。我建议选择第二个选项。
-
可以在https://json.org/的首页底部找到大约18个解析JSON的C库列表
-
如果 JSON 的结构可以变化,你需要一个更动态的 C 结构,你不能只是硬编码特定的成员名称。上面提到的 JSON 库可能有一些你可以使用的东西,而不是定义你自己的结构。
-
您的结构无法像
"Wset"这样存储键,因此不足以表示数据文件中的内容。我们不能说这些密钥对您至关重要;您的数据结构暗示它们并不重要。不过,这就是为什么您需要使用库而不是自己动手的原因(除非您手头有很多时间)。我正在滚动我自己的图书馆;一两年来,我一直在做这件事,时不时地(大部分)。这很有趣。