使用 YAJL 解析 C 中复杂的 JSON 子对象

2023-12-25

我让 YAJL 解析简单的元素,如包含的示例中给出的,没有问题。 (字符串、整数、数组……)

示例代码可以在这里找到:http://lloyd.github.io/yajl/yajl-2.0.1/example_2parse_config_8c-example.html http://lloyd.github.io/yajl/yajl-2.0.1/example_2parse_config_8c-example.html

但现在我有这种类型的 JSON 对象:

{
"cmd":2,
"properties":
    [
        {
        "idx":40,
        "val":8813.602692
        },
        {
        "idx":41,
        "val":960
        },
        {
        "idx":42,
        "val":2
        },
        {
        "idx":48,
        "val":9
        }
    ]

}

我可以使用以下命令检索命令(请参阅链接示例中使用的变量的定义):

const char * path[] = {"cmd", (const char *) 0 };
yajl_val v = yajl_tree_get(ynode, path, yajl_t_number);
if (v)
  *cmd = (commands)((int)YAJL_GET_INTEGER(v));

我可以使用以下方法获取对属性数组的引用:

int ar_sz;
const char * path[] = {"properties", (const char *) 0 };
yajl_val v = yajl_tree_get(ynode, path, yajl_t_array);
if (v)
  {
  ar_sz = v->u.array.len;
  }

它为我提供了正确的数组大小,但我不知道如何从数组元素中检索嵌套元素 idx 和 val。

非常感谢任何帮助


通过查看yajl_tree.h特别是yajl_val_s结构:

{
    const char * path[] = { "properties", (const char *) 0 };
    yajl_val v = yajl_tree_get( node, path, yajl_t_array );
    if ( v && YAJL_IS_ARRAY( v ) ) {
        printf( "is array\n" );

        // iterate over array elements,
        // it's an array so access array.len inside yajl_val_s.union
        size_t len = v->u.array.len;
        int i;
        for ( i = 0; i < len; ++i ) {

            // get ref to one object in array at a time
            yajl_val obj = v->u.array.values[ i ]; // object
            // iterate over values in object: pairs of (key,value)
            // u.object.len tells you number of elements
            size_t nelem = obj->u.object.len;
            int ii;
            for ( ii = 0; ii < nelem; ++ii ) {
                // key is just char *
                const char * key = obj->u.object.keys[ ii ];     // key
                // values is an array object
                yajl_val val = obj->u.object.values[ ii ];       // val
               // example: check if double,
               // could do more checks or switch on value ...
               if ( YAJL_IS_DOUBLE( val ) )
                    printf( "%s/%f ", key, val->u.number.d );
            }
            printf( "\n" );
        }
    } else { printf( "is not array\n" ); }
}

输出应该类似于:

is array
idx/40.000000 val/8813.602692 
idx/41.000000 val/960.000000 
idx/42.000000 val/2.000000 
idx/48.000000 val/9.000000 
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用 YAJL 解析 C 中复杂的 JSON 子对象 的相关文章

随机推荐

  • SQL-Server 2005 的 Oracle 等效 ROWNUM?

    在 Oracle PL SQL 中我习惯这样写 SELECT FROM MY TABLE WHERE ROWNUM lt 100 为了仅获取名为 MY TABLE 的表的前 100 条记录 SQL SERVER 中等效的 SELECT 语句
  • jQuery - 检查 DOM 元素是否已经存在

    我正在尝试通过 Ajax 和 jQuery 动态添加一些表单元素 我想确保不会两次创建相同的元素 因此我只想在尚未将其添加到 DOM 时添加它 我的所有元素都有一个唯一的 CSS id 例如 data 1 我正在使用以下命令来检查该元素是否
  • 按行上的字数对大量文件的行进行排序(最好是并行)

    我正在研究一种社区检测算法 用于分析 Facebook 的社交网络数据 第一个任务是检测图中的所有派系 可以有效地并行完成 并留下如下输出 17118 17136 17392 17064 17093 17376 17118 17136 17
  • Next.JS + AMP CSS

    我在 Next js 中使用 AMP 和 CSS 时遇到问题 在我的头部组件中 我有 在 HTML 源代码中 它显示为 在控制台中我收到此错误 The mandatory attribute amp custom is missing in
  • 为什么 SCNNode .flattenedClone() 会崩溃或使性能变差?

    我正在尝试添加大约 4 5kSCNNode对象到场景 它们的几何形状是以下两种之一SCNPlanes 其材质由CALayers 但我认为这并不重要 CALayerDelegate每个仅调用一次 因此这似乎不是问题 性能很糟糕 With sh
  • 在 Windows 上找不到 PHP 8.1.9 的 php_pdo_informix.dll

    我必须在安装了 Apache 2 4 54 PHP 8 1 9 VS16 x64 线程安全 的 Windows 10 版本 20H2 上测试 php 应用程序 已安装 informix client sdk 4 50 FC8 并且 INFO
  • 如何使按钮文本从文本更改为空名称并延迟?

    我正在使用 tkinter 库作为 GUI 基本上我使用 for 循环创建 4 个按钮 每个按钮都有一个随机数作为文本 现在 当我尝试实现一种方法时遇到了困难 该方法允许按钮文本显示为数字 然后在一秒钟左右更改为任何内容 完成此操作后 下一
  • 序列化ctype联合

    有没有办法序列化 ctype 联合以便通过套接字发送它们 我试图通过套接字将联合发送到网络服务器 但我无法序列化数据 而是作为联合对象的实例发送 是否可以使用 Python Struct 库来执行此操作 我不相信它支持联合 任何帮助深表感谢
  • Swift 包管理器条件编译不尊重标志

    我有一个具有以下结构的 Package swift 文件 var package Package name MyProject targets Target name MyProject dependencies exclude Exclu
  • 过滤掉Python子进程模块中需要终端的命令

    我正在开发一个机器人 它接受来自网络 XMPP 的命令 并使用Python中的子进程模块来执行它们并发回命令的输出 本质上它是一个类似 SSH 的基于 XMPP 的非交互式 shell 机器人仅执行来自经过身份验证的可信源的命令 因此允许任
  • 查找本地网络中的所有IP地址

    我想使用 Java 代码查找当前连接到的本地网络中设备的所有 IP 地址 有用的实用程序Advanced IP Scanner http www advanced ip scanner com 能够在我的中找到各种IP地址subnet ht
  • 使用 Pyparsing 访问解析的元素

    我有一堆句子需要解析并转换为相应的正则表达式搜索代码 我的句子的例子 LINE CONTAINS phrase one BEFORE phrase2 AND phrase3 AND LINE STARTSWITH Therefore we
  • 如何自定义活动管理布局?

    我需要自定义活动管理布局 但我该怎么做呢 活动管理布局实际上并未定义为布局文件 而是以编程方式生成 因此 将自定义布局放置在布局目录中实际上不会覆盖默认布局 但是 您可以对应用程序中的活动管理布局方法进行猴子补丁或鸭子打孔 下面将向标题添加
  • Swift,自定义 UIButton 单击时不起作用

    我有一个使用 xib 文件创建的自定义 UIButton 当我在视图上使用自定义按钮时 按下它时它不起作用 我的 RoundBtn swift 文件 import UIKit IBDesignable class RoundBtn UIBu
  • 在 Android 应用程序中使用 MultiDex 运行 ProGuard 两次,并且仅第二次出现警告/注释?

    我在 Android 应用程序中使用 MultiDex 和 ProGuard 当我运行我的应用程序时 结果发现 proguard 运行了两次 以下是 proguard 运行后的任务 app transformClassesAndResour
  • 如何在android中的工具栏图标中显示通知计数

    我想为Android制作一个图标计数器 就像购物车一样 我看到许多电子商务应用程序购物车图标数量增加 我展示了 Flipkart 应用程序快照 在我的解决方案中 每当有新通知到达时 计数器就会增加 如购物应用程序中观察到的 试试这个 它适用
  • 返回多个值时如何指定函数的返回类型?

    在Python中 我们可以将函数的返回类型指定为 def foo gt int some int get some int return some int 返回多个值时如何指定返回类型 例如 如何指定以下函数的返回类型 def bar gt
  • Android 2.2 切换小部件的最佳向后移植是什么? [关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 我正在寻找 2 2 版 Android Switch 小部件的稳定向后移植 请推荐您正在使用的开源库
  • 如何针对 xcode/clang/macos 中使用 libc++ 编译的静态库编译应用程序?

    当我尝试编译测试控制台应用程序以测试同一工作区上静态库的某些功能时 我在二进制文件的链接阶段遇到了问题 只有当我选择使用 libc 标准库时才会发生这种情况 缺少符号错误如下 Undefined symbols for architectu
  • 使用 YAJL 解析 C 中复杂的 JSON 子对象

    我让 YAJL 解析简单的元素 如包含的示例中给出的 没有问题 字符串 整数 数组 示例代码可以在这里找到 http lloyd github io yajl yajl 2 0 1 example 2parse config 8c exam