5

Lua script converts empty array as an object. How to avoid conversion.

test.lua

local json_str = '{\"items\":[],\"properties\":{}}'
return cjson.encode(cjson.decode(json_str))

Output

redis-cli --eval test.lua

"{\"items\":{},\"properties\":{}}"

items are an array [] but the output is an object {}

Sumeet Kumar Yadav
  • 11,912
  • 6
  • 43
  • 80
  • This was asked here: https://stackoverflow.com/q/43272872/12918181 – Darius Feb 25 '20 at 16:54
  • In the above question, I am not able to find relation between emptyArray() and toJsonStr() function . Can you help me to modify second approach Fix by code an above answer. – Sumeet Kumar Yadav Feb 25 '20 at 17:43

2 Answers2

3

The main difference between JSON object definition and lua table, that lua table has no type array.

Empty JSON array [] or object {} is converted to lua table {}, but empty lua table {} can be converted to array [] or object {}.

To my knowledge, cjson for redis has no solution for this problem at the moment, possible solution is mentioned in Redis Lua Differetiating empty array and object. (I can't argue if it works)

Darius
  • 1,060
  • 2
  • 6
  • 17
3

According to this great post you can set the following option to cjson:

cjson.encode_empty_table_as_object(false)

So cjson.encode({dogs = {}}) resolves to {"dogs": []}

Marco Weber
  • 829
  • 10
  • 19