问题描述
我刚刚发布了红宝石的宝石通过HTTP API使用一些JSON:
我的纳伊夫红宝石code只是转换通过API端点(json_data)回到红宝石哈希(hash_data)复/嵌套JSON数据结构,在一个平面一到一transaltion(JSON红宝石哈希,反之亦然)。 TAT的罚款,但...
我想一个编程接口更高级。
也许instatiating一个端点一类资源,但我感到困惑的一个聪明的实现。
让我用一种抽象的code解释。
让说,我有通过API获得一个复杂/嵌套JSON,
通常哈希的数组,递归嵌套这里下面(例如想象):
json_data ='[{
通勤:{
分钟:0,
startTime时:周三05月06日22点14分12秒EDT 2014年
地点:
{
纬度:40.4220061
经度:40.4220061
},
{
纬度:40.4989909
经度:40.48989805
},
{
纬度:40.4111169
经度:40.42222869
}
]
}
},
{
通勤:{
分钟:2,
startTime时:周三5月28日20点14分十二秒EDT 2014年
地点:
{
纬度:43.4220063
经度:43.4220063
}
]
}
}]
目前我做什么,当我收到了类似的JSON形成API仅仅是:
#从JSON散列
hash_data = JSON.load json_data#和分配值:
COORDS = hash_data.first [通勤] [位置。最后
COORDS [经度] =40.00#是40.4111169
COORDS [纬度] =41.00#是40.42222869
这是确定的,但与awfull /混淆语法。
相反,我可能会喜欢这样的:
#创建哈希对象资源
RES = Resource.create(hash_data)#...一些处理#分配一个嵌套变量:经度,对象纬度:RES
COORDS = res.first.commute.locations.last
coords.longitude =40.00#是40.4111169
coords.latitude =41.00#是40.42222869#...一些处理#转换修改的对象:水库成散列再次:
modified_hash = res.save#和可能至少我会恢复到以JSON:
modified_json = modified_hash传入json.dump
我看了intresting的帖子:
的
和复制克里威尔逊'code,我在这里勾勒下执行:
类资源 高清self.create(散)
新(散)
结束 高清初始化(散)
hash.to_obj
结束 高清保存
#或to_hash()
# 去做!帮帮我! (见下文)
结束结束
类::哈希
#添加密钥散列
高清to_obj
self.each做| K,V | v.to_obj如果v.kind_of?哈希
v.to_obj如果v.kind_of?排列 K = k.gsub。(/ \\ | \\ S | - | \\ / | \\'/'_')downcase.to_sym ##创建和初始化实例变量此键/值对
self.instance_variable_set(@#[KP},第五章) ##创建一个返回实例变量的吸
self.class.send(:define_method,K,PROC {self.instance_variable_get(@#[KP})}) ##创建设置实例变量二传手
self.class.send(:define_method,#[KP} ={PROC | V | self.instance_variable_set(@#[KP},V)})
结束
自回归
结束
结束类::阵列
高清to_obj
self.map {| V | v.to_obj}
结束
结束
#------------------------------------------------- -----------
顺便说一句,我研究了一下项目的ActiveResource(是的Rails的一部分,如果我很好理解)。
战神可能是伟大的我的范围,但问题是ARES有充分的REST API的有点太严presumption ...
在我的情况服务器API不在战神所期望的方式完全REST风格...
总之,我会做了很多工作,以子/修改战神行为
而此刻我放弃的想法使用的ActiveResource
问题:
- 有人可以帮助我实现(我用递归方法真不好...... :-()?以上code中的save()方法
-
确实存在一定的宝石,上面绘制的hash_to_object()和object_to_hash()的翻译?
-
你想想一个任意散列未来弗罗马JSON通过HTTP API,它们自动客观化是什么?
我的意思是:我看到了伟大的职业,我不需要客户端的静态线的数据结构,从而可以灵活地可能的服务器端的变化。
但在另一方面,这样做自动客观化,存在的副作用可能的利弊,让安全问题......像恶意JSON注射(可能untrasted通信网...)
您如何看待这一切?任何建议,欢迎!
对不起,我长的帖子,我的Ruby语言的元编程azards: - )
乔治
更新2:我对问题3点仍然有兴趣阅读意见:
优点/缺点创建资源类每一个接收到JSON
优点/缺点创建静态(preemptive属性)/ automatich /动态嵌套对象
更新1:长回复西蒙娜:
谢谢,你是正确的醪有一个甜蜜的.to_hash()方法:
要求'JSON'
需要'HASHIEjson_data ='{
通勤:{
分钟:0,
startTime时:周三05月06日22点14分12秒EDT 2014年
地点:
{
纬度:40.4220061
经度:40.4220061
},
{
纬度:40.4989909
经度:40.48989805
},
{
纬度:40.4111169
经度:40.42222869
}
]
}
}哈希#trasforma
哈希= JSON.load json_data把散列RES = HASHIE :: Mash.new哈希#分配一个嵌套变量:经度,对象纬度:RES
COORDS = res.commute.locations.last
coords.longitude =40.00#是40.4111169
coords.latitude =41.00#是40.42222869放;把经度:#{} res.commute.locations.last.longitude
把纬度:#{} res.commute.locations.last.latitudemodified_hash = res.to_hash
放;把modified_hash
此功能是由几个宝石提供。其中最知名的是,特别是 HASHIE ::醪
。
Mash
also supports multi-level objects.
这篇关于自/至JSON API客体红宝石哈希的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!