2016-11-23 49 views
2

我试图将包含对象和数组的JSON文件转换为JSON文件。将JSON转换为Ruby中的hashmap

下面是JSON文件

{ 
    "localbusiness":{ 
     "name": "toto", 
     "phone": "+11234567890" 
    }, 
    "date":"05/02/2016", 
    "time":"5:00pm",  
    "count":"4", 
    "userInfo":{ 
     "name": "John Doe", 
     "phone": "+10987654321", 
     "email":"[email protected]", 
     "userId":"user1234333" 
    } 
} 

我的目标是挽救这是一个数据库,如MongoId。我想用地图来获得这样的:

localbusiness_name => "toto", 
localbusiness_phone => "+11234567890", 
date => "05/02/2016", 
... 
userInfo_name => "John Doe" 
... 

我试图地图,但它不是分裂的本地业务的阵列或USERINFO

def format_entry 
    ps = @params.map do | h | 
    ps.merge!(h) 
    @@logger.info("entry #{h}") 
    end 
    @@logger.info("formatting the data #{ps}") 
    ps 
end 

我真的不如何解析每个条目和重建名称

+0

“@ params”是JSON散列还是Rails变量?是否可以显示'format_entry'的输出? –

+0

@ElijahSchutz格式条目不工作是合并失败。 params是JSON散列 – Seb

+0

你有JSON文件作为文本,并且你想将它转换为嵌套散列吗?如果是这样,'需要'json'; myhash = JSON.parse(文本);'会做到这一点。 –

回答

3

它看起来对我来说,你试图将内部散列“变平”为一个大散列。由于您想要将散列键添加到子散列键,因此拼合不正确。这将需要遍历散列,然后通过每个子散列重新循环。此代码示例仅适用于您有1层深度的情况。如果你有多个图层,那么我会建议制作两种方法,或者一种递归方法。

@business = { # This is a hash, not a json blob, but you can take json and call JSON.parse(blob) to turn it into a hash. 
    "localbusiness":{ 
     "name": "toto", 
     "phone": "+11234567890" 
    }, 
    "date":"05/02/2016", 
    "time":"5:00pm", 
    "count":"4", 
    "userInfo":{ 
     "name": "John Doe", 
     "phone": "+10987654321", 
     "email":"[email protected]", 
     "userId":"user1234333" 
    } 
} 

@squashed_business = Hash.new 

@business.each do |k, v| 
    if v.is_a? Hash 
    v.each do |key, value| 
     @squashed_business.merge! (k.to_s + "_" + key.to_s) => value 
    end 
    else 
    @squashed_business.merge! k => v 
    end 
end 

我注意到,您在列举的时候哈希@params.each { |h| ... },因为它提供给你一个键和值会出现“意外”的结果。相反,您需要像上述代码示例中那样执行@params.each { |key, value| ... }

+0

不,我的回答不会改善你的。只要我看到它,我就会提起它,并在看到你的评论时即将删除它。 –

+0

谢谢。我们都只是想帮助!我认为你使用'class'在你的答案上做了一些很酷/相似的事情? – Dbz

+0

我发现你的方式更高效,更直接。而OP的重要部分是解决方案。你指出了正确的。我们都在这里提供帮助。 –