Skip to content

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

Open

Description

@flyerSon

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}}

为何不一样?

Activity

  1. utmhikari commented on Jul 29, 2019

    @utmhikari

    目测是源码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

  2. Trumeet commented on Oct 5, 2019

    @Trumeet

    English please.

  3. fnaith commented on Jun 1, 2020

    @fnaith

    (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.

  4. ruyi789 commented on Nov 22, 2022

    @ruyi789
    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
    
  5. alexandro-rezakhani commented on Nov 22, 2022

    @alexandro-rezakhani

    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

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions