标签: cjson

使用cJSON读入JSON数组

我试图使用由Dave Gamble编写的cJSON库来读取以下JSON数组:

"items": 
[
    {
        "name": "command",
        "index": "X",
        "optional": "0"
    },
    {
        "name": "status",
        "index": "X",
        "optional": "0"
    }
]
Run Code Online (Sandbox Code Playgroud)

通过阅读他的文档,我找到了阅读单个对象的方法,但没有关于数组的内容,我无法从给出的示例中推测如何做到这一点.

这是我正在尝试的:

cJSON* request_json = NULL;
cJSON* items = cJSON_CreateArray();
cJSON* name = NULL;
cJSON* index = NULL;
cJSON* optional = NULL;

request_json = cJSON_Parse(request_body);

items = cJSON_GetObjectItem(request_json, "items");

name = cJSON_GetObjectItem(items, "name");
index = cJSON_GetObjectItem(items, "index");
optional = cJSON_GetObjectItem(items, "optional");
Run Code Online (Sandbox Code Playgroud)

我知道这是错的,不仅因为它不起作用,而且我无法弄清楚如何使它正确.

显然,我需要循环读取数组中每个索引的所有条目的过程.我不知道我将如何做到这一点,因为我不知道我应该在这个代码中使用索引,或者它是否是正确的开始.有一个cJSON_GetArrayItem(),但它只需要一个数字(可能是一个索引)而没有字符串来表示它想要的字段.

c json cjson

10
推荐指数
3
解决办法
3万
查看次数

Redis Lua 区分空数组和对象

当我在 redis 3.2 中使用脚本在 json 对象中设置特定值时,我在 cjson lua 中遇到了这个错误。

目前,redis 中的 lua 不区分空的 json 数组或空的 json 对象。在序列化包含数组的 json 对象时,这会导致严重的问题。

eval "local json_str = '{\"items\":[],\"properties\":{}}' return cjson.encode(cjson.decode(json_str))" 0
Run Code Online (Sandbox Code Playgroud)

结果:

"{\"items\":{},\"properties\":{}}"
Run Code Online (Sandbox Code Playgroud)

我找到了这个解决方案https://github.com/mpx/lua-cjson/issues/11但我无法在 redis 脚本中实现。

这是一次失败的尝试:

eval 

"function cjson.mark_as_array(t) 
local mt = getmetatable(t) or {} 
mt.__is_cjson_array = true 
return setmetatable(t, mt) 
end 
function cjson.is_marked_as_array(t) 
local mt = getmetatable(t) 
return mt and mt.__is_cjson_array end 
local json_str = '{\"items\":[],\"properties\":{}}' 
return cjson.encode(cjson.decode(json_str))" 

0
Run Code Online (Sandbox Code Playgroud)

任何帮助或指针表示赞赏。

lua json redis cjson

6
推荐指数
1
解决办法
1589
查看次数

Lua 在 Ubuntu 上找不到已安装的 luarocks

我安装 luarocks:

$ sudo apt-get install luarocks
Run Code Online (Sandbox Code Playgroud)

我通过 luarocks 安装 lua-cjson:

$sudo luarocks install lua-cjson
Run Code Online (Sandbox Code Playgroud)

显示包:

$luarocks list

Installed rocks:
----------------
lua-cjson
   2.1.0-1 (installed) - /usr/local/lib/luarocks/rocks
Run Code Online (Sandbox Code Playgroud)

所以,我看到包:

$luarocks show lua-cjson

License:    MIT
Homepage:   http://www.kyne.com.au/~mark/software/lua-cjson.php
Installed in:   /usr/local
. . . 
Modules:
    cjson
    lua2json
    json2lua
    cjson.util


    lua-cjson
          2.1.0-1 (installed) - /usr/local/lib/luarocks/rocks
Run Code Online (Sandbox Code Playgroud)

但是,Lua 看不到模块:

$lua
Lua 5.2.3  Copyright (C) 1994-2013 Lua.org, PUC-Rio
> require "cjson"
stdin:1: module 'cjson' not found:
....


$locate cjson.so
 /usr/local/lib/lua/5.1/cjson.so
Run Code Online (Sandbox Code Playgroud)

这是什么错误??

lua luarocks cjson

5
推荐指数
1
解决办法
6319
查看次数

调用者是否应该释放cJSON_Print()的返回值?

我正在使用cJSON库,并且具有以下功能:

void printJsonObject(cJSON *item)
{
    char *json_string = cJSON_Print(item);
    printf("%s\n", json_string);
}
Run Code Online (Sandbox Code Playgroud)

此功能会泄漏内存吗?

c json cjson

3
推荐指数
1
解决办法
1507
查看次数

使用cJSON.h创建json对象

我正在尝试创建如下的JSON对象,但我无法在其中添加第二项,例如:

"CarType": "mercedes",
"carID": "merc123"
Run Code Online (Sandbox Code Playgroud)

以及其他项目.

我想像这样创建JSON:

{
  cars: [
    {
      "CarType": "BMW",
      "carID": "bmw123"
    },
    {
      "CarType": "mercedes",
      "carID": "merc123"
    },
    {
      "CarType": "volvo",
      "carID": "vol123r"
    },
    {
      "CarType": "ford",
      "carID": "ford123"
    }
  ]
};
Run Code Online (Sandbox Code Playgroud)

我到目前为止尝试过:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "cJSON.h"

int main (void){
    char field_name[32], value[32], *out;
    cJSON *root,*car;

    root  = cJSON_CreateObject();
    car=  cJSON_CreateArray();

    cJSON_AddItemToObject(root, "CarType", cJSON_CreateString("BMW"));
    cJSON_AddItemToObject(root, "carID", cJSON_CreateString("bmw123"));
    cJSON_AddItemToArray(car, root);

    out = cJSON_Print(car);
    printf("%s\n",out);

    return 0;
}
Run Code Online (Sandbox Code Playgroud)

我的输出是这样的(缩进完全如此处所示):

[{
        "CarType":  "BMW",
        "carID":    "bmw123" …
Run Code Online (Sandbox Code Playgroud)

c json cjson

3
推荐指数
1
解决办法
7128
查看次数

空字符串或空变量的 JSON 标准是什么?

我正在构建一个解析 JSON 模板的应用程序,然后用新数据替换对象的值。我的问题是在 JSON 中表示空数据的标准方法是什么?

这就是我现在处理的方式:

  • 空字符串表示为“”
  • 一个空的 int/float/double/bool/等。表示为 NULL

这样对吗?

json cjson

3
推荐指数
1
解决办法
2万
查看次数

cJSON内存泄漏

我在程序中使用cJSON将我的值转换为JSON并将其写入文件.以下是我的代码示例:

void writeStructToFile(IOPipe this, struct structtype somevalues) {
    cJSON *jout = cJSON_CreateObject();
    cJSON_AddItemToObject(jout, "V1", cJSON_CreateNumber(somevalues.v1));
    cJSON_AddItemToObject(jout, "V2", cJSON_CreateNumber(somevalues.v2));
    fprintf(this->outstream, "%s", cJSON_Print(jout));
    cJSON_Delete(jout);
}
Run Code Online (Sandbox Code Playgroud)

效果很好,但过了一段时间后我发现Linux(嵌入式)因为内存使用异常或设备(在Cortex A8上)挂起而导致程序死机.在我发现调试之后,即使我在最后删除指针,该泄漏仍然出现在此函数中.有人能看到泄漏吗?

c json pointers memory-leaks cjson

2
推荐指数
1
解决办法
2857
查看次数

cJSON 如何解析 json 数组?

我有一个关于 C 解析 json 数组的问题,我知道 cJSON 如何解析 json 使用 C,但是我在 Google 中找不到任何关于如何解析 json 数组的结果,我看过Using cJSON to read in a JSON array,但它不适合我。

我从 Web API 接收到一个 json 数组,它看起来像这样:

[{\"id\":\"25139\",\"date\":\"2016-10-27\",\"name\":\"Komfy Switch With Camera DKZ-201S\\/W Password Disclosure\"},{\"id\":\"25117\",\"date\":\"2016-10-24\",\"name\":\"NETDOIT weak password Vulnerability\"}]
Run Code Online (Sandbox Code Playgroud)

如您所见,数组中有很多 json,那么,如何使用 cJSON lib 解析数组?

c json cjson

2
推荐指数
1
解决办法
5315
查看次数

lua cjson 编码 nil 字段

我有一个 lua 表,例如:

local _table = {}

_table["name"] = "some user name"    
_table["phone"] = nil

ngx.say(cjson.encode(_table))
Run Code Online (Sandbox Code Playgroud)

ngx.say 输出如下:

{"name":"some user name"}
Run Code Online (Sandbox Code Playgroud)

如您所见,_table 中的电话字段已被忽略!如何在 cjson 编码处理期间设置 encoding-options 以包含任何 nil 字段。如:

{"name":"some user name", "phone": null}
Run Code Online (Sandbox Code Playgroud)

lua cjson

2
推荐指数
1
解决办法
386
查看次数

Redis cjson:有没有办法在不完全解码的情况下操作 JSON?

鉴于以下示例,有没有办法将值从“bar”更改为“blah”而不对其进行解码?

redis 127.0.0.1:6379> eval 'return cjson.encode({["foo"]= "bar"})' 0
"{\"foo\":\"bar\"}"

redis 127.0.0.1:6379> eval 'return cjson.decode(ARGV[1])["foo"]' 0 "{\"foo\":\"bar\"}"
"bar"
Run Code Online (Sandbox Code Playgroud)

参考例如:https : //redis.io/commands/eval

lua redis cjson

2
推荐指数
1
解决办法
1288
查看次数

如何在 cJSON 中测试布尔值的 TRUE/FALSE

我正在使用 cJSON 解析 json 文件。一切进行得都很顺利。但其中一个数据元素是布尔值,问题是我不明白如何使用 cJSON 的函数来读取布尔类型。数据文件包含如下行:

"isDaytime": true,
Run Code Online (Sandbox Code Playgroud)

我尝试使用如下代码块:

if (cJSON_IsTrue("isDaytime")==0) {
    printf("isDaytime = TRUE\n");
} else {
    printf("isDaytime = FALSE\n");
}
Run Code Online (Sandbox Code Playgroud)

当我尝试用 gcc 编译它时,我收到以下消息:

undefined reference to `cJSON_IsTrue'
Run Code Online (Sandbox Code Playgroud)

我想也许 cJSON 将它表示为 int ?我不知道。无论如何,有谁知道我应该如何调用 cJSON_IsTrue() ?或者也许我根本不应该调用 cJSON_IsTrue() 。如果不是,我应该如何检查这种类型的数据元素?如果它是一个 int,我就完成了。如果它是一个 char *,我就完成了。我只是不确定如何测试它是真是假。

编辑: 根据 cJSON 库的文档,此处:https://github.com/DaveGamble/cJSON

由于整个库只有一个 C 文件和一个头文件,因此您只需将 cJSON.h 和 cJSON.c 复制到您的项目源中即可开始使用。

这就是我使用 cJSON 的方式。我刚刚将这两个文件包含在我的项目中,一切都很顺利。直到我尝试使用 cJSON_IsTrue() 函数。我无法从文档或源文件中了解如何正确使用该函数。我想我只是尝试“错误地”使用它,然后通过出现的任何错误消息来纠正自己。

我没想到会收到“未定义的引用”错误消息。我查了一下源码,确实有这个功能......

David Collins 建议我在编译时需要链接到 cjson 库。我包括了来源,所以我认为这不是真正的答案。但好吧。因此,我按照说明进行操作,并在我的系统上实际安装了该库。我收到了相同的未定义参考错误消息。

事实证明,库本身安装的位置:/usr/local/lib 没有被引用。我将安装的文件复制到系统的正确目录中,当我使用 -lcjson 标志进行编译时,cJSON_IsTrue() 函数现在可用。

那么如何使用呢?这就是我的使用方式:

`if ( cJSON_IsTrue(cJSON_GetObjectItem(subitem, "isDayTime")) == 1) {
    /* do …
Run Code Online (Sandbox Code Playgroud)

c cjson

1
推荐指数
1
解决办法
6321
查看次数

计算cJSON对象的字节大小

现在我正在努力计算cJSON物体的大小。到目前为止,我已经这样做了:

cJSON *payload = cJSON_CreateObject();
...
size_t size_payload = sizeof(payload);
Run Code Online (Sandbox Code Playgroud)

显然,我初始化了有效负载对象,然后打印到终端以验证数据的完整性,一切正常。然而,打印sizeof结果后,字节数始终为 4,但对于长字符串(如我的),它应该在 500 字节左右。

我在这里缺少处理cJSON对象的东西吗?

希望你能帮忙,或者给我一个例子来说明如何获得整个尺寸的正确值。

c c++ arduino cjson esp32

1
推荐指数
1
解决办法
1207
查看次数

迭代c中的cJSON嵌套对象

如何迭代嵌套的cJSON对象?我想从C中的deviceData父对象获取(打印)所有键和值。它是一个cJson对象。

 obj =     {      "command": "REPLACE_ROWS",
            "table": "Device.XXX",
            "deviceData": {
                    "device0": {
                      "DeviceName": "Filtered Device",
                        "MACAddress": "112233445599"
                    },
                    "device1": {
                        "DeviceName": "Filtered Device",
                        "MACAddress": "112233445599"
                    },
                    "device2": {
                        "DeviceName": "Filtered Device",
                        "MACAddress": "112233445599"
                    }
           }
    };
Run Code Online (Sandbox Code Playgroud)

如何在C中打印deviceData的键(例如device0 device1设备2等)。预先感谢。

c cjson

0
推荐指数
1
解决办法
2541
查看次数

标签 统计

cjson ×13

c ×8

json ×7

lua ×4

redis ×2

arduino ×1

c++ ×1

esp32 ×1

luarocks ×1

memory-leaks ×1

pointers ×1