Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

一个json字符串,decode成table,之后再把这个table encode成json,俩个json不一样! #19

Open
flyerSon opened this issue Jun 15, 2019 · 5 comments

Comments

@flyerSon
Copy link

local json_before = {"key":[{},{},{},{},{},{},{},{},{},{}],"roleAttr":{"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"0":0,"1":0,"2":0}}
local list = json.decode(json_before );
local json_after = json.encode(list);
此时的json_afre为:{"key":[[],[],[],[],[],[],[],[],[],[]],"roleAttr":{"1":0,"0":0,"3":0,"2":0,"5":0,"4":0,"7":0,"6":0,"9":0,"8":0}}

为何不一样?

@utmhikari
Copy link

utmhikari commented Jul 29, 2019

目测是源码encode_table的next测到nil直接判定为array了
可以小魔改一下,比如:

 local t_type = 'array'
 local n = 0
 local max = -1
 for k in pairs(val) do
    if type(k) == "string" then
      t_type = 'object'
      break
    elseif type(k) == "number" then
      n = n + 1
      max = math.max(max, k)
    else
      error("invalid table: mixed or invalid key types")
    end
  end
if t_type == 'array' then
    if n == 0 then
      t_type = 'object'
    elseif n ~= #val then
      t_type = 'sparse_array'
    end
  end

来区分array、稀疏array跟object

@Trumeet
Copy link

Trumeet commented Oct 5, 2019

English please.

@fnaith
Copy link

fnaith commented Jun 1, 2020

(Just translating)

local json_before = {"key":[{},{},{},{},{},{},{},{},{},{}],"roleAttr":{"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"0":0,"1":0,"2":0}}
local list = json.decode(json_before );
local json_after = json.encode(list);
此时的json_afre为:{"key":[[],[],[],[],[],[],[],[],[],[]],"roleAttr":{"1":0,"0":0,"3":0,"2":0,"5":0,"4":0,"7":0,"6":0,"9":0,"8":0}}

为何不一样?

local json_before = {"key":[{},{},{},{},{},{},{},{},{},{}],"roleAttr":{"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"0":0,"1":0,"2":0}}
local list = json.decode(json_before );
local json_after = json.encode(list);
In this moment json_after is : {"key":[[],[],[],[],[],[],[],[],[],[]],"roleAttr":{"1":0,"0":0,"3":0,"2":0,"5":0,"4":0,"7":0,"6":0,"9":0,"8":0}}

Why are json_before and json_after different?

目测是源码encode_table的next测到nil直接判定为array了
可以小魔改一下,比如:

 local t_type = 'array'
 local n = 0
 local max = -1
 for k in pairs(val) do
    if type(k) == "string" then
      t_type = 'object'
      break
    elseif type(k) == "number" then
      n = n + 1
      max = math.max(max, k)
    else
      error("invalid table: mixed or invalid key types")
    end
  end
if t_type == 'array' then
    if n == 0 then
      t_type = 'object'
    elseif n ~= #val then
      t_type = 'sparse_array'
    end
  end

来区分array、稀疏array跟object

It seems like the encode_table treat input table as array when it found nil by next.
Could modify code like...

 local t_type = 'array'
 local n = 0
 local max = -1
 for k in pairs(val) do
    if type(k) == "string" then
      t_type = 'object'
      break
    elseif type(k) == "number" then
      n = n + 1
      max = math.max(max, k)
    else
      error("invalid table: mixed or invalid key types")
    end
  end
if t_type == 'array' then
    if n == 0 then
      t_type = 'object'
    elseif n ~= #val then
      t_type = 'sparse_array'
    end
  end

...to distinguish between array, sparse array and table.

@ruyi789
Copy link

ruyi789 commented Nov 22, 2022

local __json_object = {__json_object =  function() end}
function json.newObject()
  return setmetatable({}, __json_object)
end

parse_object

local function parse_object(str, i)
  local res = json.newObject()

encode_table

  local t = getmetatable(val)
  if (t == nil or t.__json_object == nil) and (rawget(val, 1) ~= nil or next(val) == nil) then

@alexandro-rezakhani
Copy link

Hello! Would you mind creating a pull request on my fork so that I may include your suggestions?

Thanks!

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

6 participants