Code Monkey home page Code Monkey logo

lua-cjson's People

Contributors

ki7chen avatar mpx avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

lua-cjson's Issues

Lua 5.1.5 fails to load cjson or cjson.safe

Using Lua 5.1.5

On Rocky Linux 8.7

  • Linux uhn5klbjhmgmt-p.lab.rmn.local 4.18.0-425.10.1.el8_7.x86_64 #1 SMP Thu Jan 12 16:32:13 UTC 2023 x86_64 x86_64 x86_64 GNU/Linux
  • gcc (GCC) 8.5.0 20210514 (Red Hat 8.5.0-16)

Luarocks compiles and installs it with no problem :

$ luarocks install lua-cjson 
Warning: falling back to wget - install luasec to get native HTTPS support
Installing https://luarocks.org/lua-cjson-2.1.0.10-1.src.rock

lua-cjson 2.1.0.10-1 depends on lua >= 5.1 (5.1-1 provided by VM)
gcc -O2 -fPIC -I/home/user1/.luaver/lua/5.1.5/include -c lua_cjson.c -o lua_cjson.o
gcc -O2 -fPIC -I/home/user1/.luaver/lua/5.1.5/include -c strbuf.c -o strbuf.o
gcc -O2 -fPIC -I/home/user1/.luaver/lua/5.1.5/include -c fpconv.c -o fpconv.o
gcc  -shared -o cjson.so lua_cjson.o strbuf.o fpconv.o
lua-cjson 2.1.0.10-1 is now installed in /home/user1/.luaver/luarocks/3.9.2_5.1 (license: MIT)

However when issuing a require on it it fail:

/usr/bin/lua: error loading module 'cjson.safe' from file '/home/user1/lib/lua/5.1/cjson/safe.so':
        /home/user1/lib/lua/5.1/cjson/safe.so: undefined symbol: lua_pcall
stack traceback:
        [C]: in ?
        [C]: in function 'require'
        ./sgce_check.lua:4: in main chunk
        [C]: in ?

error loading module 'cjson'

The problem occurs when I required the 'cjson'.
Environment: Mac OS X 10.11.6, lua 5.3

error loading module 'cjson' from file '/usr/local/lib/lua/5.3/cjson.so':
dlopen(/usr/local/lib/lua/5.3/cjson.so, 6): Symbol not found: _lua_insert
Referenced from: /usr/local/lib/lua/5.3/cjson.so
Expected in: flat namespace
in /usr/local/lib/lua/5.3/cjson.so

What's wrong with it?

cjson with luajit2.1

Hi. I've got problems installing cjson with luajit2.1:

lua_cjson.c:1298:13: error: static declaration of ‘luaL_setfuncs’ follows non-static declaration
 static void luaL_setfuncs (lua_State *l, const luaL_Reg *reg, int nup)
             ^
In file included from lua_cjson.c:44:0:
/home/travis/build/OystParis/lua-nats/install/lua/include/luajit-2.1/lauxlib.h:88:18: note: previous declaration of ‘luaL_setfuncs’ was here
 LUALIB_API void (luaL_setfuncs) (lua_State *L, const luaL_Reg *l, int nup);
                  ^
Error: Failed installing dependency: https://luarocks.org/lua-cjson-2.1.0-1.src.rock - Build error: Failed compiling object lua_cjson.o

do you have any idea?

dlopen failed: cannot locate symbol "floor" referenced by ...

lua-cjson 2.1.0-1

using termux pkg luarocks on armv7a android

u0_a185@localhost ~/luatest> lua -e "require 'cjson'"
lua: error loading module 'cjson' from file
 '/data/data/com.termux/files/usr/lib/lua/5.3/cjson.so':
    dlopen failed: cannot locate symbol "floor" referenced by "/data/data/com.termux/files/usr/lib/lua/5.3/cjson.so"...                                                           stack traceback:
[C]: in ?
[C]: in function 'require'
(command line):1: in main chunk
[C]: in ?

Use an options object instead of global switches.

Currently cjson uses global library settings:

cjson.decode_invalid_numbers([setting])
cjson.encode_invalid_numbers([setting])
cjson.encode_keep_buffer([keep])
cjson.encode_max_depth([depth])
cjson.decode_max_depth([depth])
cjson.encode_sparse_array([convert[, ratio[, safe]]])

This interface presents the problem of storing some state on the library. This is not ideal, since the output of cjson.encode and cjson.decode, when called with the same parameters, will change depending on those global settings. That is undesirable in lots of scenarios.

I propose an interface that, while allowing the same functionality, does not store any state on the library itself, and makes cjson.encode and cjson.decode deterministic: Add a (non-mandatory) options parameter to both.

cjson.encode(value, options)
cjson.decode(str, options)

For example:

cjson.decode("{'a' = 1}", {invalid_numbers = true})
cjson.encode({a = 1}, {depth = 1})

I would provide a pull request for this myself, but again I lack the necessary C skills to do so.

Please consider this as an enhancement request. Since this would be an interface-breaking change, I would suggest including it on a 3.x version.

cjson.so: undefined symbol: lua_rotate

Hi,
I use luajit 2.1.0-beta3 and lua-cjson 2.1.0-1 from http://luarocks.org,I print a error "cjson.so: undefined symbol: lua_rotate" when running. I search that "lua_rotate" is a new add in lua 5.3. But there has the note in lua-cjson 2.1.0-1 require lua > 5.1 not 5.3. So, which lua version is need by lua-cjson 2.1.0-1?luajit 2.1.0-beta3 and lua-cjson 2.1.0-1 not match?
Thank you.

Support Big Numbers

Since all numbers are represented as double, larger numbers (like longs) get truncated. For example, the output of this code...

cjson.encode(cjson.decode("9007199254740992"))```

...is not the same as the input. This is needed since I need to sometimes parse the JSON output of APIs that I do not control and that use numbers that do not fit into doubles.

A proposed fix is in this pull request:

https://github.com/mpx/lua-cjson/pull/36

Undefined symbol luaL_setfuncs

I'm currently using lua5.3.But this is what I get from the logs.
lua entry thread aborted: runtime error: error loading module 'cjson' from file '/usr/local/lib/lua/5.3/cjson.so':
/usr/local/lib/lua/5.3/cjson.so: undefined symbol: luaL_setfuncs
Any idea on how to fix this

Allow differentiation of arrays and objects for proper empty-object serialization

This issue is related to #6, in which a global switch is suggested in order to force empty objects to "always be arrays" or "always be objects".

I would argue that while that will solve some specific issues, it will not resolve the more general one, which is differentiating between empty arrays and empty objects in general. Consider the following string:

local json_str = '{"items":[],"properties":{}}'

Ideally cjson should be able to decode that string to a lua object, that when encoded back to json returns the same string.

assert(cjson.encode(cjson.decode(json_str))

This means that cjson needs a way to "mark" tables that are arrays. This could be used by the decoder itself, but would be useful if exposed, so people could give cjson "hints" about what must be an array, even when empty.

I'm writing a possible Lua implementation here. In my case I'm using metatables, but maybe someone with more C knowledge can think of other ideas.

function cjson.mark_as_array = function(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

cjson.encode should mark all arrays it finds using the cjson.mark_as_array.

On the other hand, when cjson.decode encountered an empty table, it should use cjson.is_marked_as_array to decide whether to return "{}" or "[]". Notice that this would only apply to empty tables. A lua table like {1,2, a = "foo"} should be encoded as an object, even when marked as an array.

I would gladly provide a pull request for this, but I don't do C. Please consider this a feature request.

Decode JSON went wrong

I have a config file whose content is organized in JSON, when I read the file from disk and assign its content to a Lua string and print shows exactly the same as the file.But when I try to decode it use cjson the console shows "Expected value but found invalid token at character 1".

Here is my file:
{"apkname":"lukaYingyongbao_215_jiagu_sign.apk","verName":"2.1.5","verCode":20,"verForced":"false","appname":"撸卡漫画","title":"撸卡漫画更新啦","verInfo":"《撸卡漫画》新版本上线啦!\n主要修复版本部分机型的登录问题以及性能优化"}

Compilation issue: Redefinition of fpconv_init when defining USE_INTERNAL_FPCONV

Hi,
I'm trying to compile lua-json with the USE_INTERNAL_FPCONV file and get the following compliation error:

fpconv.c:205:6: error: redefinition of ‘fpconv_init’
 void fpconv_init()
      ^~~~~~~~~~~
In file included from fpconv.c:36:0:
fpconv.h:10:20: note: previous definition of ‘fpconv_init’ was here
 static inline void fpconv_init()
                    ^~~~~~~~~~~
Makefile:90: recipe for target 'fpconv.o' failed
make[1]: *** [fpconv.o] Error 1

Indeed, fpconv_init is defined in both fpconv.c and fpconv.h.
A fix could be undefining fpconv_init() in fpconv.c under the same flag.

What do you think?

lua 5.3 to add integer

local cjson = require "cjson"

local tab = {}
tab[10] = 199
tab.pp = "fan"
local estr = cjson.encode(tab)
print("-------------", estr)
local totab = cjson.decode(estr)
for k,v in pairs(totab) do
print("---fff-------", k,v)
end
the question : 199 change to 199.0, so bad when i use to json protocol to communicate with client!
how to solve it, please.
thanks!

Precompiled library for windows

Hi, today i spent 6 hours to compile cjson in windows 11, so is any compiled package anywhere?
because "luarocks make" not working right out of box
lua_cjson.obj : error LNK2019.
cjson.dll : fatal error LNK1120
i understand its all can be solved but, but it cant take to much time.
So if author just wants non C/C++ people suffered so its good, i understand author, and i will pass this lib.
And if author want help to users, so good windows compile manual or precompiled file will be veyr fine aid, thanks fo feading.

PS; I undertand that linux is cool and i prefer linux for development but sometime windows platform cant be avoided....

Error: error loading module 'cjson' from file %1 is not a valid Win32 application.

I am running:

local cjson = require("cjson")

and in response I am getting this:

Error: error loading module 'cjson' from file 'C:\Program Files (x86)\Lua\5.1\systree\lib\lua\5.1\cjson.dll':
        %1 is not a valid Win32 application.

stack traceback:
        [string "boot.lua"]:637: in function <[string "boot.lua"]:633>
        [C]: at 0x7fffaa6d6130
        [C]: in function 'require'
        main.lua:2: in main chunk
        [C]: in function 'require'
        [string "boot.lua"]:475: in function <[string "boot.lua"]:311>
        [C]: in function 'xpcall'
        [string "boot.lua"]:645: in function <[string "boot.lua"]:639>
        [C]: in function 'xpcall

any ideas how to fix?

UPDATE:
I just found out that cjson runs fine with just lua. I had been running it with love2d. Still looking into why I'm getting this error

Crash when use the value from cjson.decode

I write a test:
emptyValue = {}
emptyValueText = cjson.encode(emptyValue)
print("empty value text is: " .. emptyValueText)
emptyValueNew = cjson.decode(emptyValueText)
print("type(emptyValueNew) is " .. type(emptyValueNew))
emptyValueNew.newMember = "emptyValueNew string"
print("emptyValueNew.newMember = " .. emptyValueNew.newMember)

Program crashed after print: "type(emptyValueNew) is table"

error loading module cjson.safe

i m trying to import the requests library but i got this error

error loading module 'cjson.safe' from file '/usr/local/lib/lua/5.2/cjson.so':
/usr/local/lib/lua/5.2/cjson.so: undefined symbol: lua_objlen

any help ?

option for indented output

Hi Mark,

Only minimified output is possible?

An option for indented output would be nice.

Thanks,
Cosmin.

Error using luarocks installation

lua_cjson.c: In function ‘json_append_data’:
lua_cjson.c:743:19: warning: implicit declaration of function ‘lua_objlen’ [-Wimplicit-function-declaration]
             len = lua_objlen(l, -1);
                   ^~~~~~~~~~

I'm using lua 5.3, and according to the manual lua_objlen is a thing, so I don't see why this would error, but it does

Examples in manual are confusing

I'm not expert and, or seasoned Lua programmer or user, but I find that you defined cjson2 two times in separate examples or statements in your manual.adoc as:

local cjson2 = cjson.new()

which has not been used anywhere or any further in this document and, or examples :-(

The poor and, or overly expressive documentation and bad examples are major reasons for the good code and, or nice open source software like this and Lua going ashtray day by day.

Improve Windows build support

I tried using both x86 and x64 for compilation

Using https://rocks.moonscript.org/lua-cjson-2.1.0-1.src.rock... switching to 'build' mode
cl /MD /O2 -c -Folua_cjson.obj -IC:/lua/5.1/include/ lua_cjson.c -DDISABLE_INVALID_NUMBERS
Microsoft (R) C/C++ Optimizing Compiler Version 18.00.21005.1 for x64
Copyright (C) Microsoft Corporation.  All rights reserved.

lua_cjson.c
c:\users\greg waxman\appdata\local\temp\luarocks_lua-cjson-2.1.0-1-4204\lua-cjson-2.1.0\strbuf.h(78) : error C2054: expected '(' to follow 'inline'
c:\users\greg waxman\appdata\local\temp\luarocks_lua-cjson-2.1.0-1-4204\lua-cjson-2.1.0\strbuf.h(79) : error C2085: 'strbuf_reset' : not in formal parameter list
c:\users\greg waxman\appdata\local\temp\luarocks_lua-cjson-2.1.0-1-4204\lua-cjson-2.1.0\strbuf.h(79) : error C2143: syntax error : missing ';' before '{'
c:\users\greg waxman\appdata\local\temp\luarocks_lua-cjson-2.1.0-1-4204\lua-cjson-2.1.0\strbuf.h(83) : error C2054: expected '(' to follow 'inline'
c:\users\greg waxman\appdata\local\temp\luarocks_lua-cjson-2.1.0-1-4204\lua-cjson-2.1.0\strbuf.h(84) : error C2085: 'strbuf_allocated' : not in formal parameter list
c:\users\greg waxman\appdata\local\temp\luarocks_lua-cjson-2.1.0-1-4204\lua-cjson-2.1.0\strbuf.h(84) : error C2143: syntax error : missing ';' before '{'
c:\users\greg waxman\appdata\local\temp\luarocks_lua-cjson-2.1.0-1-4204\lua-cjson-2.1.0\strbuf.h(90) : error C2054: expected '(' to follow 'inline'
c:\users\greg waxman\appdata\local\temp\luarocks_lua-cjson-2.1.0-1-4204\lua-cjson-2.1.0\strbuf.h(91) : error C2082: redefinition of formal parameter 'strbuf_empty_length'
c:\users\greg waxman\appdata\local\temp\luarocks_lua-cjson-2.1.0-1-4204\lua-cjson-2.1.0\strbuf.h(91) : error C2143: syntax error : missing ';' before '{'
c:\users\greg waxman\appdata\local\temp\luarocks_lua-cjson-2.1.0-1-4204\lua-cjson-2.1.0\strbuf.h(95) : error C2054: expected '(' to follow 'inline'
c:\users\greg waxman\appdata\local\temp\luarocks_lua-cjson-2.1.0-1-4204\lua-cjson-2.1.0\strbuf.h(96) : error C2082: redefinition of formal parameter 'strbuf_ensure_empty_length'
c:\users\greg waxman\appdata\local\temp\luarocks_lua-cjson-2.1.0-1-4204\lua-cjson-2.1.0\strbuf.h(96) : error C2143: syntax error : missing ';' before '{'
c:\users\greg waxman\appdata\local\temp\luarocks_lua-cjson-2.1.0-1-4204\lua-cjson-2.1.0\strbuf.h(101) : error C2054: expected '(' to follow 'inline'
c:\users\greg waxman\appdata\local\temp\luarocks_lua-cjson-2.1.0-1-4204\lua-cjson-2.1.0\strbuf.h(102) : error C2082: redefinition of formal parameter 'strbuf_empty_ptr'
c:\users\greg waxman\appdata\local\temp\luarocks_lua-cjson-2.1.0-1-4204\lua-cjson-2.1.0\strbuf.h(102) : error C2143: syntax error : missing ';' before '{'
c:\users\greg waxman\appdata\local\temp\luarocks_lua-cjson-2.1.0-1-4204\lua-cjson-2.1.0\strbuf.h(106) : error C2054: expected '(' to follow 'inline'
c:\users\greg waxman\appdata\local\temp\luarocks_lua-cjson-2.1.0-1-4204\lua-cjson-2.1.0\strbuf.h(107) : error C2082: redefinition of formal parameter 'strbuf_extend_length'
c:\users\greg waxman\appdata\local\temp\luarocks_lua-cjson-2.1.0-1-4204\lua-cjson-2.1.0\strbuf.h(107) : error C2143: syntax error : missing ';' before '{'
c:\users\greg waxman\appdata\local\temp\luarocks_lua-cjson-2.1.0-1-4204\lua-cjson-2.1.0\strbuf.h(111) : error C2054: expected '(' to follow 'inline'
c:\users\greg waxman\appdata\local\temp\luarocks_lua-cjson-2.1.0-1-4204\lua-cjson-2.1.0\strbuf.h(112) : error C2082: redefinition of formal parameter 'strbuf_length'
c:\users\greg waxman\appdata\local\temp\luarocks_lua-cjson-2.1.0-1-4204\lua-cjson-2.1.0\strbuf.h(112) : error C2143: syntax error : missing ';' before '{'
c:\users\greg waxman\appdata\local\temp\luarocks_lua-cjson-2.1.0-1-4204\lua-cjson-2.1.0\strbuf.h(116) : error C2054: expected '(' to follow 'inline'
c:\users\greg waxman\appdata\local\temp\luarocks_lua-cjson-2.1.0-1-4204\lua-cjson-2.1.0\strbuf.h(117) : error C2082: redefinition of formal parameter 'strbuf_append_char'
c:\users\greg waxman\appdata\local\temp\luarocks_lua-cjson-2.1.0-1-4204\lua-cjson-2.1.0\strbuf.h(117) : error C2143: syntax error : missing ';' before '{'
c:\users\greg waxman\appdata\local\temp\luarocks_lua-cjson-2.1.0-1-4204\lua-cjson-2.1.0\strbuf.h(122) : error C2054: expected '(' to follow 'inline'
c:\users\greg waxman\appdata\local\temp\luarocks_lua-cjson-2.1.0-1-4204\lua-cjson-2.1.0\strbuf.h(123) : error C2085: 'strbuf_append_char_unsafe' : not in formal parameter list
c:\users\greg waxman\appdata\local\temp\luarocks_lua-cjson-2.1.0-1-4204\lua-cjson-2.1.0\strbuf.h(123) : error C2143: syntax error : missing ';' before '{'
c:\users\greg waxman\appdata\local\temp\luarocks_lua-cjson-2.1.0-1-4204\lua-cjson-2.1.0\strbuf.h(127) : error C2054: expected '(' to follow 'inline'
c:\users\greg waxman\appdata\local\temp\luarocks_lua-cjson-2.1.0-1-4204\lua-cjson-2.1.0\strbuf.h(128) : error C2082: redefinition of formal parameter 'strbuf_append_mem'
c:\users\greg waxman\appdata\local\temp\luarocks_lua-cjson-2.1.0-1-4204\lua-cjson-2.1.0\strbuf.h(128) : error C2143: syntax error : missing ';' before '{'
c:\users\greg waxman\appdata\local\temp\luarocks_lua-cjson-2.1.0-1-4204\lua-cjson-2.1.0\strbuf.h(134) : error C2054: expected '(' to follow 'inline'
c:\users\greg waxman\appdata\local\temp\luarocks_lua-cjson-2.1.0-1-4204\lua-cjson-2.1.0\strbuf.h(135) : error C2085: 'strbuf_append_mem_unsafe' : not in formal parameter list
c:\users\greg waxman\appdata\local\temp\luarocks_lua-cjson-2.1.0-1-4204\lua-cjson-2.1.0\strbuf.h(135) : error C2143: syntax error : missing ';' before '{'
c:\users\greg waxman\appdata\local\temp\luarocks_lua-cjson-2.1.0-1-4204\lua-cjson-2.1.0\strbuf.h(140) : error C2054: expected '(' to follow 'inline'
c:\users\greg waxman\appdata\local\temp\luarocks_lua-cjson-2.1.0-1-4204\lua-cjson-2.1.0\strbuf.h(141) : error C2082: redefinition of formal parameter 'strbuf_ensure_null'
c:\users\greg waxman\appdata\local\temp\luarocks_lua-cjson-2.1.0-1-4204\lua-cjson-2.1.0\strbuf.h(141) : error C2143: syntax error : missing ';' before '{'
c:\users\greg waxman\appdata\local\temp\luarocks_lua-cjson-2.1.0-1-4204\lua-cjson-2.1.0\strbuf.h(145) : error C2054: expected '(' to follow 'inline'
c:\users\greg waxman\appdata\local\temp\luarocks_lua-cjson-2.1.0-1-4204\lua-cjson-2.1.0\strbuf.h(146) : error C2082: redefinition of formal parameter 'strbuf_string'
c:\users\greg waxman\appdata\local\temp\luarocks_lua-cjson-2.1.0-1-4204\lua-cjson-2.1.0\strbuf.h(146) : error C2143: syntax error : missing ';' before '{'
c:\users\greg waxman\appdata\local\temp\luarocks_lua-cjson-2.1.0-1-4204\lua-cjson-2.1.0\fpconv.h(15) : error C2054: expected '(' to follow 'inline'
c:\users\greg waxman\appdata\local\temp\luarocks_lua-cjson-2.1.0-1-4204\lua-cjson-2.1.0\fpconv.h(15) : error C2085: 'fpconv_init' : not in formal parameter list
c:\users\greg waxman\appdata\local\temp\luarocks_lua-cjson-2.1.0-1-4204\lua-cjson-2.1.0\fpconv.h(18) : error C2085: 'fpconv_g_fmt' : not in formal parameter list
c:\users\greg waxman\appdata\local\temp\luarocks_lua-cjson-2.1.0-1-4204\lua-cjson-2.1.0\fpconv.h(19) : error C2085: 'fpconv_strtod' : not in formal parameter list
lua_cjson.c(92) : error C2085: 'json_token_type_t' : not in formal parameter list
lua_cjson.c(94) : error C2085: 'json_token_type_name' : not in formal parameter list
lua_cjson.c(94) : error C2143: syntax error : missing ';' before '='
lua_cjson.c(113) : error C2016: C requires that a struct or union has at least one member
lua_cjson.c(113) : error C2061: syntax error : identifier 'json_token_type_t'
lua_cjson.c(130) : error C2059: syntax error : '}'
lua_cjson.c(136) : error C2061: syntax error : identifier 'json_config_t'
lua_cjson.c(138) : error C2059: syntax error : '}'
lua_cjson.c(141) : error C2016: C requires that a struct or union has at least one member
lua_cjson.c(141) : error C2061: syntax error : identifier 'json_token_type_t'
lua_cjson.c(149) : error C2059: syntax error : '}'
lua_cjson.c(192) : error C2143: syntax error : missing '{' before '*'
lua_cjson.c(194) : error C2065: 'json_config_t' : undeclared identifier
lua_cjson.c(194) : error C2065: 'cfg' : undeclared identifier
lua_cjson.c(194) : warning C4552: '*' : operator has no effect; expected operator with side-effect
lua_cjson.c(196) : error C2065: 'cfg' : undeclared identifier
lua_cjson.c(196) : warning C4047: '=' : 'int' differs in levels of indirection from 'void *'
lua_cjson.c(197) : error C2065: 'cfg' : undeclared identifier
lua_cjson.c(200) : error C2065: 'cfg' : undeclared identifier
lua_cjson.c(200) : warning C4047: 'return' : 'int *' differs in levels of indirection from 'int'
lua_cjson.c(206) : error C2143: syntax error : missing '{' before '*'
lua_cjson.c(268) : error C2065: 'json_config_t' : undeclared identifier
lua_cjson.c(268) : error C2065: 'cfg' : undeclared identifier
lua_cjson.c(268) : warning C4047: '=' : 'int' differs in levels of indirection from 'int *'
lua_cjson.c(268) : error C2106: '=' : left operand must be l-value
lua_cjson.c(270) : error C2065: 'cfg' : undeclared identifier
lua_cjson.c(270) : error C2223: left of '->encode_sparse_convert' must point to struct/union
lua_cjson.c(270) : warning C4047: 'function' : 'const char **' differs in levels of indirection from 'int'
lua_cjson.c(270) : warning C4024: 'json_enum_option' : different types for formal and actual parameter 4
lua_cjson.c(270) : error C2198: 'json_enum_option' : too few arguments for call
lua_cjson.c(271) : error C2065: 'cfg' : undeclared identifier
lua_cjson.c(271) : error C2223: left of '->encode_sparse_ratio' must point to struct/union
lua_cjson.c(271) : error C2198: 'json_integer_option' : too few arguments for call
lua_cjson.c(272) : error C2065: 'cfg' : undeclared identifier
lua_cjson.c(272) : error C2223: left of '->encode_sparse_safe' must point to struct/union
lua_cjson.c(272) : error C2198: 'json_integer_option' : too few arguments for call
lua_cjson.c(281) : error C2065: 'json_config_t' : undeclared identifier
lua_cjson.c(281) : error C2065: 'cfg' : undeclared identifier
lua_cjson.c(281) : warning C4047: '=' : 'int' differs in levels of indirection from 'int *'
lua_cjson.c(281) : error C2106: '=' : left operand must be l-value
lua_cjson.c(283) : error C2065: 'cfg' : undeclared identifier
lua_cjson.c(283) : error C2223: left of '->encode_max_depth' must point to struct/union
lua_cjson.c(283) : warning C4047: 'function' : 'int *' differs in levels of indirection from 'int'
lua_cjson.c(283) : warning C4024: 'json_integer_option' : different types for formal and actual parameter 3
lua_cjson.c(283) : error C2198: 'json_integer_option' : too few arguments for call
lua_cjson.c(290) : error C2065: 'json_config_t' : undeclared identifier
lua_cjson.c(290) : error C2065: 'cfg' : undeclared identifier
lua_cjson.c(290) : warning C4047: '=' : 'int' differs in levels of indirection from 'int *'
lua_cjson.c(290) : error C2106: '=' : left operand must be l-value
lua_cjson.c(292) : error C2065: 'cfg' : undeclared identifier
lua_cjson.c(292) : error C2223: left of '->decode_max_depth' must point to struct/union
lua_cjson.c(292) : warning C4047: 'function' : 'int *' differs in levels of indirection from 'int'
lua_cjson.c(292) : warning C4024: 'json_integer_option' : different types for formal and actual parameter 3
lua_cjson.c(292) : error C2198: 'json_integer_option' : too few arguments for call
lua_cjson.c(298) : error C2065: 'json_config_t' : undeclared identifier
lua_cjson.c(298) : error C2065: 'cfg' : undeclared identifier
lua_cjson.c(298) : warning C4047: '=' : 'int' differs in levels of indirection from 'int *'
lua_cjson.c(298) : error C2106: '=' : left operand must be l-value
lua_cjson.c(300) : error C2065: 'cfg' : undeclared identifier
lua_cjson.c(300) : error C2223: left of '->encode_number_precision' must point to struct/union
lua_cjson.c(300) : warning C4047: 'function' : 'int *' differs in levels of indirection from 'int'
lua_cjson.c(300) : warning C4024: 'json_integer_option' : different types for formal and actual parameter 3
lua_cjson.c(300) : error C2198: 'json_integer_option' : too few arguments for call
lua_cjson.c(306) : error C2065: 'json_config_t' : undeclared identifier
lua_cjson.c(306) : error C2065: 'cfg' : undeclared identifier
lua_cjson.c(306) : warning C4047: '=' : 'int' differs in levels of indirection from 'int *'
lua_cjson.c(306) : error C2106: '=' : left operand must be l-value
lua_cjson.c(309) : error C2065: 'cfg' : undeclared identifier
lua_cjson.c(309) : error C2223: left of '->encode_keep_buffer' must point to struct/union
lua_cjson.c(311) : error C2065: 'cfg' : undeclared identifier
lua_cjson.c(311) : error C2223: left of '->encode_keep_buffer' must point to struct/union
lua_cjson.c(311) : warning C4047: 'function' : 'const char **' differs in levels of indirection from 'int'
lua_cjson.c(311) : warning C4024: 'json_enum_option' : different types for formal and actual parameter 4
lua_cjson.c(311) : error C2198: 'json_enum_option' : too few arguments for call
lua_cjson.c(314) : error C2065: 'cfg' : undeclared identifier
lua_cjson.c(314) : error C2223: left of '->encode_keep_buffer' must point to struct/union
lua_cjson.c(314) : fatal error C1003: error count exceeds 100; stopping compilation

Error: Failed installing dependency: https://rocks.moonscript.org/lua-cjson-2.1.0-1.src.rock - Build error: Failed compiling object lua_cjson.obj

Nested json decode error

{"status_code":503,"body":"{"code": 1, "message": "Service unavailable"}"}

I want to decode the statement above, but got Expected value but found invalid token at character 27 error. I tried another statement like below:

{"status_code":503,"body":{"code": 1, "message": "Service unavailable"}}

However there is same error. It looks like cjson does't support decode nested? Is there another solution? Thx.

How to get empty json array,use cjson

root@tt:~# lua
Lua 5.1.5  Copyright (C) 1994-2012 Lua.org, PUC-Rio (double int32)
> j = require 'cjson'
>
> s = {"",""}
>
> print(j.encode(s))
["",""]
> s = {nil,nil}
>
> print(j.encode(s))
{}
>

How to get empty json array,use cjson.

Symbol not found: _lua_objlen

I'm requiring the module using

package.path = package.path .. ";../?.lua"
local json = require('cjson')

And I'm getting:

lua: error loading module 'cjson' from file '/usr/local/lib/lua/5.3/cjson.so':
        dlopen(/usr/local/lib/lua/5.3/cjson.so, 6): Symbol not found: _lua_objlen
  Referenced from: /usr/local/lib/lua/5.3/cjson.so
  Expected in: flat namespace
 in /usr/local/lib/lua/5.3/cjson.so
stack traceback:
        [C]: in ?
        [C]: in function 'require'
        log.lua:6: in main chunk
        [C]: in ?

The test suite is too inflexible

I am trying to package lua-cjson for openSUSE and it is not easy.

Provided ./runtest.sh is very inflexible, so in order to make it work, I had to patch it, and even then I was not able to make cmake-type build working, because it has hardcoded Lua 5.1 version in it (we build for multiple Lua versions, and it would be awesome, if we could test with them; it would be good even for you, so that you may be sure about the extent of your Lua coverage).

Complete build log with all details

Not loading for luajit/lua 5.1

Even though in the makefile i changed lua_version from 5.3 to 5.1 it doesnt load in 5.1 and luajit and instead spits out this error:

error loading module 'cjson' from file './cjson.so':
./cjson.so: undefined symbol: luaL_setfuncs

I am using "make"

EDIT: Short: I cant compile it for luajit. I'm a noob at c compiling and stuff, and it doesnt show anywhere in the manual.

decode will not decode an encoded table

Hi,
Using lua v5.1 and lua-cjson v2.1.0.6-1.

Why print(cjson.decode(cjson.encode({success = true}))) results in "" (an empty line) and not {success = true}?
What am I missing?!

Thanks!

'fpconv_init' declared but never defined on Alpine Linux 3.7

I installed tarantool 1.8 on Alpine Linux 3.7 and now I am trying a few extra rocks.

When issuing "tarantoolctl rocks install luajwt" at the OS prompt, I see the errors below. Any idea why this might be?

Missing dependencies for luajwt 1.3-4:
luacrypto >= 0.3.2-1 (not installed)
lua-cjson >= 2.1.0 (not installed)
lbase64 >= 20120807-3 (not installed)

luajwt 1.3-4 depends on luacrypto >= 0.3.2-1 (not installed)
Installing http://rocks.moonscript.org/luacrypto-0.3.2-2.src.rock
gcc -O2 -fPIC -I/usr/local/include/tarantool -c src/lcrypto.c -o src/lcrypto.o -I/usr/include
gcc -shared -o crypto.so -L/usr/local/lib src/lcrypto.o -L/usr/lib -Wl,-rpath,/usr/lib: -lcrypto
luacrypto 0.3.2-2 is now installed in /root/.rocks (license: MIT)

luajwt 1.3-4 depends on lua-cjson >= 2.1.0 (not installed)
Installing http://rocks.moonscript.org/lua-cjson-2.1.0-1.src.rock
gcc -O2 -fPIC -I/usr/local/include/tarantool -c lua_cjson.c -o lua_cjson.o
lua_cjson.c:1298:13: error: static declaration of 'luaL_setfuncs' follows non-static declaration
static void luaL_setfuncs (lua_State *l, const luaL_Reg *reg, int nup)
^~~~~~~~~~~~~
In file included from lua_cjson.c:44:0:
/usr/local/include/tarantool/lauxlib.h:88:18: note: previous declaration of 'luaL_setfuncs' was here
LUALIB_API void (luaL_setfuncs) (lua_State *L, const luaL_Reg *l, int nup);
^~~~~~~~~~~~~
In file included from lua_cjson.c:47:0:
fpconv.h:15:20: warning: inline function 'fpconv_init' declared but never defined
extern inline void fpconv_init();
^~~~~~~~~~~

Error: Failed installing dependency: http://rocks.moonscript.org/lua-cjson-2.1.0-1.src.rock - Build error: Failed compiling object lua_cjson.o

Building with VS2015

Don't believe it but finally, Visual Studio 14 defines snprintf()!
It restricts redefinition, this is added in stdio.h:

#ifdef snprintf
    #error: Macro definition of snprintf conflicts with Standard Library function declaration”
#endif

so we get
...\ucrt\stdio.h(1927): fatal error C1189: #error: Macro definition of snprintf conflicts with Standard Library function declaration [...\lua-cjson\build\cjson.vcxproj errors.

My solution to this was skipping of add_definitions(-Dstrncasecmp=_strnicmp) for MSVC14. Patch follows:

CMakeLists.txt | 6 ++++--
 1 file changed, 4 insertions(+), 2 deletions(-)

diff --git a/CMakeLists.txt b/CMakeLists.txt
index ca26381..ff74d6f 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -71,8 +71,10 @@ endif()
 if(MSVC)
     add_definitions(-D_CRT_SECURE_NO_WARNINGS)
     add_definitions(-Dinline=__inline)
-    add_definitions(-Dsnprintf=_snprintf)
-    add_definitions(-Dstrncasecmp=_strnicmp)
+   if(NOT MSVC14)
+       add_definitions(-Dsnprintf=_snprintf)
+   endif(NOT MSVC14)
+   add_definitions(-Dstrncasecmp=_strnicmp)
 endif()

 add_library(cjson MODULE lua_cjson.c strbuf.c ${FPCONV_SOURCES})

Keep on coding, Jedzia;)

maximum encode_number_precision value

for the latest code, I found the maximum value of encode_number_precision is 16, which is merged in commit.
openresty@f79aa68

For our scenes, we use int64 value in json strings, which means 16 precission numbers is not enough for us.

So any suggestions?
Can we change max value of encode_number_precision to 19, 20 or add new configuration like cjson.max_encode_number_precision(X) for different scenes?

Thanks.

cjson encode table encodes `/`

Doing:

cjson.encode({url =  "https://google.com})

prints {"url":"https:\/\/google.com"}. I'm trying to stringify a JSON object here, and don't expect to get the / escaped. Is there any solution?

lua-cjson escapes slashes

Hi!

Why does lua-cjson escape slashes:

> cjson = require 'cjson'
> print(cjson.encode('/'))
"\/"

Is that a bug?

Writing floats is locale dependent

Hi,
CJSON is not locale independent. Specifically, if the current locale wants us to encode the decimal point as a comma, as in Germany, CJSON will happily do so.

This makes the other side rather unhappy. Worse, if the problem occurs in a list it's not even recognized by the receiving parser.

Please fix!

Compilation warning about fpconv_init

cc -c -O3 -Wall -pedantic -DNDEBUG  -I/usr/local/include -fpic -o lua_cjson.o lua_cjson.c
In file included from lua_cjson.c:48:
fpconv.h:15:20: warning: inline function ‘fpconv_init’ declared but never defined
   15 | extern inline void fpconv_init();
      |                    ^~~~~~~~~~~
cc -c -O3 -Wall -pedantic -DNDEBUG  -I/usr/local/include -fpic -o strbuf.o strbuf.c
cc -c -O3 -Wall -pedantic -DNDEBUG  -I/usr/local/include -fpic -o fpconv.o fpconv.c
cc  -shared -o cjson.so lua_cjson.o strbuf.o fpconv.o

I cannot imagine what good the inline without body is. I've compiled with the following patch and everything seems to work fine.

From c9551b68ec78ecea8d31af41bbffc2f4a39d1965 Mon Sep 17 00:00:00 2001
From: Tomas Volf <[email protected]>
Date: Tue, 15 Mar 2022 18:30:24 +0100
Subject: [PATCH] Fix compilation warning about fpconv_init
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

In file included from lua_cjson.c:48:
fpconv.h:15:20: warning: inline function ‘fpconv_init’ declared but never defined
   15 | extern inline void fpconv_init();
      |                    ^~~~~~~~~~~

inline does not seem to do anything useful here, since there is no body
to inline. And extern is default. So let's just drop both, we get no
warning and everything still works.
---
 fpconv.h | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/fpconv.h b/fpconv.h
index 0124908..22cab98 100644
--- a/fpconv.h
+++ b/fpconv.h
@@ -12,7 +12,7 @@ static inline void fpconv_init()
     /* Do nothing - not required */
 }
 #else
-extern inline void fpconv_init();
+void fpconv_init();
 #endif

 extern int fpconv_g_fmt(char*, double, int);
--
2.35.1

Call decode could result in crash

local cjson = require "cjson"
while true do
local t = {"a", "b", "c"}
local s = cjson.encode(t)
local value = cjson.decode(s) --Crash every time
end

Mac install lua cjson failed

lua 5.3.1 in my mac install
cc -shared -o cjson.so lua_cjson.o strbuf.o fpconv.o
Undefined symbols for architecture x86_64:
"_luaL_argerror", referenced from:
_json_encode in lua_cjson.o
_json_decode in lua_cjson.o
_json_cfg_encode_sparse_array in lua_cjson.o
_json_cfg_encode_max_depth in lua_cjson.o
_json_cfg_decode_max_depth in lua_cjson.o
_json_cfg_encode_number_precision in lua_cjson.o
_json_arg_init in lua_cjson.o
...
"_luaL_checkinteger", referenced from:
_json_cfg_encode_sparse_array in lua_cjson.o
_json_cfg_encode_max_depth in lua_cjson.o
_json_cfg_decode_max_depth in lua_cjson.o
_json_cfg_encode_number_precision in lua_cjson.o
"_luaL_checklstring", referenced from:
_json_decode in lua_cjson.o
"_luaL_checkoption", referenced from:
_json_enum_option in lua_cjson.o
"_luaL_error", referenced from:
_json_encode in lua_cjson.o
_json_decode in lua_cjson.o
_json_append_data in lua_cjson.o
_json_append_number in lua_cjson.o
_json_process_value in lua_cjson.o
_json_arg_init in lua_cjson.o
_json_protect_conversion in lua_cjson.o
...
"_luaL_setfuncs", referenced from:
_lua_cjson_new in lua_cjson.o
"_lua_checkstack", referenced from:
_json_append_data in lua_cjson.o
_json_process_value in lua_cjson.o
"_lua_createtable", referenced from:
_lua_cjson_new in lua_cjson.o
_json_process_value in lua_cjson.o
"_lua_getfield", referenced from:
_luaopen_cjson_safe in lua_cjson.o
_lua_cjson_safe_new in lua_cjson.o
"_lua_gettop", referenced from:
_json_encode in lua_cjson.o
_json_decode in lua_cjson.o
_json_arg_init in lua_cjson.o
_json_protect_conversion in lua_cjson.o
"_lua_newuserdata", referenced from:
_lua_cjson_new in lua_cjson.o
"_lua_next", referenced from:
_json_append_data in lua_cjson.o
"_lua_pcallk", referenced from:
_json_protect_conversion in lua_cjson.o
"_lua_pushboolean", referenced from:
_json_process_value in lua_cjson.o
_json_enum_option in lua_cjson.o
"_lua_pushcclosure", referenced from:
_lua_cjson_new in lua_cjson.o
_luaopen_cjson_safe in lua_cjson.o
_lua_cjson_safe_new in lua_cjson.o
"_lua_pushinteger", referenced from:
_json_cfg_encode_sparse_array in lua_cjson.o
_json_cfg_encode_max_depth in lua_cjson.o
_json_cfg_decode_max_depth in lua_cjson.o
_json_cfg_encode_number_precision in lua_cjson.o
"_lua_pushlightuserdata", referenced from:
_lua_cjson_new in lua_cjson.o
_json_process_value in lua_cjson.o
"_lua_pushlstring", referenced from:
_json_encode in lua_cjson.o
_json_process_value in lua_cjson.o
"_lua_pushnil", referenced from:
_json_append_data in lua_cjson.o
_json_arg_init in lua_cjson.o
_json_protect_conversion in lua_cjson.o
"_lua_pushnumber", referenced from:
_json_process_value in lua_cjson.o
"_lua_pushstring", referenced from:
_lua_cjson_new in lua_cjson.o
_json_enum_option in lua_cjson.o
"_lua_pushvalue", referenced from:
_json_protect_conversion in lua_cjson.o
"_lua_rawgeti", referenced from:
_json_append_data in lua_cjson.o
"_lua_rawset", referenced from:
_json_process_value in lua_cjson.o
"_lua_rawseti", referenced from:
_json_process_value in lua_cjson.o
"_lua_rotate", referenced from:
_json_protect_conversion in lua_cjson.o
"_lua_setfield", referenced from:
_lua_cjson_new in lua_cjson.o
_luaopen_cjson_safe in lua_cjson.o
_lua_cjson_safe_new in lua_cjson.o
"_lua_setmetatable", referenced from:
_lua_cjson_new in lua_cjson.o
"_lua_settop", referenced from:
_json_append_data in lua_cjson.o
"_lua_toboolean", referenced from:
_json_append_data in lua_cjson.o
_json_enum_option in lua_cjson.o
"_lua_tolstring", referenced from:
_json_append_string in lua_cjson.o
"_lua_tonumberx", referenced from:
_json_append_data in lua_cjson.o
_json_append_number in lua_cjson.o
"_lua_touserdata", referenced from:
_json_encode in lua_cjson.o
_json_decode in lua_cjson.o
_json_append_data in lua_cjson.o
_json_arg_init in lua_cjson.o
_json_destroy_config in lua_cjson.o
"_lua_type", referenced from:
_json_cfg_encode_sparse_array in lua_cjson.o
_json_cfg_encode_max_depth in lua_cjson.o
_json_cfg_decode_max_depth in lua_cjson.o
_json_cfg_encode_number_precision in lua_cjson.o
_json_append_data in lua_cjson.o
_json_append_number in lua_cjson.o
_json_enum_option in lua_cjson.o
...
"_lua_typename", referenced from:
_json_append_data in lua_cjson.o
_json_append_number in lua_cjson.o
ld: symbol(s) not found for architecture x86_64
clang: error: linker command failed with exit code 1 (use -v to see invocation)

cjson的encode后的字符的顺序问题

有如下代码:
location /echo1 {
content_by_lua '
local tb = {y=123,b=234,c=456}
local cjson = require "cjson"
local out = cjson.encode(tb)
ngx.say(out)
';
}

访问http://xxx/echo1会输出;
{"y":123,"c":456,"b":234}

如何按原来的{"y":123,"b":234,"c":456} 输出?我知道hash table都是无序或者说是顺序不确定的,如何实现我上述需求?

cjson.decode crashed if wrong json passed

Hi there!

First of all thank you for a library!
Here is some code I can't explain to myself:

00:59 ar@alexroman-XPS8700[~]$ cat cjson.lua 
#!/usr/bin/lua

local cjson = require "cjson"
local badjson = "Just a string"

print(cjson.decode(badjson))
00:59 ar@alexroman-XPS8700[~]$ ./cjson.lua 
/usr/bin/lua: ./cjson.lua:6: Expected value but found invalid token at character 1
stack traceback:
    [C]: in function 'decode'
    ./lua-cjson-bug.lua:6: in main chunk
    [C]: ?
00:59 ar@alexroman-XPS8700[~]$

Some my clients send wrong JSON and it cause crash of script.
If it's a correct behavior I'll be happy to know how can I handle this error?

Error on require

Got error requiring cjson:

/apps/nginx/lua-cjson/cjson.so:1: unexpected symbol near 'char(127)'

cjson was built with command:

make LUA_INCLUDE_DIR=/usr/include/lua5.2

Why “/” will be escaped

exp:
local t = {"ban/ana"}
local res = cjson.encode(t)
print(res)

the result is {"ban\/ana"}

But others json lib will not do this, exp jsoncpp.
If i have to do this, is there any way to avoid it?

handling totally invalid jsons

Hi,

Since this is not addressed in documentation I thought I would ask here - what's the "right" way of handling invalid JSONs without blowing up?

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.