有没有一种方法可以“向后”或自底向上地循环遍历嵌套较多的json?

fcg9iug3  于 2022-11-19  发布在  其他
关注(0)|答案(1)|浏览(104)

有没有一种有效的方法可以“向后”或自底向上遍历一个有很多嵌套的json文件?我需要从一个嵌套很重的json字符串中删除所有空字段,但由于我当前的逻辑看起来是自顶向下的,它只删除了最底层的空字段。
我的数据如下所示:

{
    "rule": {
        "description": "authentication_failed",
        "category": {
            "action": "denied"
        }
    },
    "tls": {
        "client": {
            "certificate": {
                "subject": "-"
            }
        },
        "server": {
            "certificate": {
                "subject": "-"
            }
        }
    }
}

我目前的代码如下,其中“event”是json对象:

def removeEmptyFields(event,h,name)
            h.each do |k,v|
                if (v.is_a?(Hash) || v.is_a?(Array)) && v.to_s != '{}'
                    removeEmptyFields(event,v,String.new(name.to_s) << '[' << k.to_s << ']')
                else
                    if v == '' || v == '-' || v == 'none' || v.to_s == '{}'
                        event.remove(String.new(name.to_s) << '[' << k.to_s << ']')
                    end
                end
            end
        end

        removeEmptyFields event,event.to_hash,''

我当前的数据输出(如下)并不理想。我最好的结果是如果“tls”字段被一起删除。考虑到我的代码当前遍历json的方式,我还不能让循环变量工作。

{
    "rule": {
        "description": "authentication_failed",
        "category": {
            "action": "denied"
        }
    },
    "tls": {
        "client": {
            "certificate": {}
        },
        "server": {
            "certificate": {}
        }
    }
}
70gysomp

70gysomp1#

我想我得到了你想要的输出,我只是用你的例子试了一下,所以如果我有什么错的话,请随时告诉我。希望它能有所帮助!

def removeEmptyFields(json_hash)
  hash = {}
  json_hash.each do |key, value|
    if (!value.empty? && value != '-' && value != 'none') 
    # Filter empty strings, arrays, and hashes

      hash[key] = value.class == Hash ? removeEmptyFields(value) : value
      hash.delete(key) if hash[key].empty?
    end
  end
  hash
end

相关问题