2013-12-09 161 views
0

我得到了一个JSON字符串,我想从某些值中删除。问题是JSON对象可以包含子对象,如果它们存在,我想剥离相同类型的值(基于键)。从对象中删除属性recursivly

例如,我得到这个:

{ 
    Title: "test", 
    Created: "2013-01-01", 
    ID: 1 
    Child: { 
     Title: "Test 2", 
     Created: "2013-01-02", 
     ID: 2, 
     RandomName: { 
      Title: "Test 3", 
      Created: "2013-01-05", 
      ID:3 
     } 
    } 
} 

我想删除“创建”从对象键和所有子对象。有没有一种简单的方法在Ruby中实现这一点?

回答

1

根据Tobias的回答,我修改了代码以支持子数组等。请注意,我对Ruby相当陌生,所以我不确定这是否完全完整。

keysToRemove参数是一个数组,其中包含要删除的键的名称。

def remove_recursive(hash, keysToRemove) 
    if hash.kind_of?(Array) 
     hash.each do |h| 
     remove_recursive(h, keysToRemove) 
     end 
    elsif hash.kind_of?(Hash) 
     hash.each do |key, value| 
     if keysToRemove.include?(key) 
      hash.delete(key) 
     else 
      remove_recursive(hash[key], keysToRemove) 
     end 
     end 
    end 
    end 
+1

对我很好。 –

+0

谢谢!起初,它开始轰动我,然后我想起我的JSON集合中也有阵列。 –

+0

:D是的,对不起 - 我想你的JSON字符串会匹配给定的例子,所以我没有添加。 (尽量保持代码简单,并让你推动正确的方向:)) –

1

可以编写递归调用嵌套元素的辅助(例如假设你解析的JSON的哈希)

def remove_recursive(hash) 
    hash.each do |key, value| 
    hash.delete(key) if key == "Created" 
    remove_recursive(hash[key]) if hash[key].kind_of?(Hash) 
    end 
end 
1

您可以用PROC做到这一点,如果你不希望有一个方法只是为了这个。

require 'json' 

json_string = '{ 
    "Title": "test", 
    "Created": "2013-01-01", 
    "ID": 1, 
    "Child": { 
     "Title": "Test 2", 
     "Created": "2013-01-02", 
     "ID": 2, 
     "RandomName": { 
      "Title": "Test 3", 
      "Created": "2013-01-05", 
      "ID": 3 
     } 
    } 
}' 


without_fields = proc do |h, *fields| 
    h = h.reject {|k,_| fields.include?(k) } 
    h.each do |k, v| 
    if v.is_a?(Hash) 
     h[k] = without_fields.call(v, *fields) 
    end 
    end 
    h 
end 

json_obj = JSON.load(json_string) 
cleaned_obj = without_fields.call(json_obj, 'Created') 
JSON.dump(cleaned_obj) 
# => "{\"Title\":\"test\",\"ID\":1,\"Child\":{\"Title\":\"Test 2\",\"ID\":2,\"RandomName\":{\"Title\":\"Test 3\",\"ID\":3}}}"