本文介绍了自/至JSON API客体红宝石哈希的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我刚刚发布了红宝石的宝石通过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

问题:


  1. 有人可以帮助我实现(我用递归方法真不好...... :-()?以上code中的save()方法

  2. 确实存在一定的宝石,上面绘制的hash_to_object()和object_to_hash()的翻译?


  3. 你想想一个任意散列未来弗罗马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客体红宝石哈希的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!

08-05 11:27