如何使用序列化格式清理JSON字符串?

时间:2014-01-03 20:51:56

标签: ruby json

我尝试解码并解析API返回的字符串,但返回的JSON对象的语法很奇怪。

我可以从字符串中删除元素,但是想知道清理这个JSON字符串并将其转换为Ruby哈希的最佳方法是什么?

"DataCallBack([
    {
        \"detail1\": \"result1\",
        \"detail2\": \"result2\",
        \"Attr1\": [
            {
                \"detail1\": \"result1\",
                \"detail2\": \"result2\",
            },
            {...}
        ]
        ],
        \"Attr2\": [
            {
                \"detail1\": \"result1\",
                \"detail2\": \"result2\",
            },
            {...}
        ]
    }
])"

2 个答案:

答案 0 :(得分:1)

只需在查询字符串中请求没有?callback=DataCallBack的数据,您就可以获得可以直接解析的原始JSON。

答案 1 :(得分:0)

从JSONP响应中剥离JSON很容易:

jsonp = 'DataCallBack([
    {
        "detail1": "result1",
        "detail2": "result2",
        "Attr1": [
            {
                "detail1": "result1",
                "detail2": "result2"
            }
        ],
        "Attr2": [
            {
                "detail1": "result1",
                "detail2": "result2"
            }
        ]
    }
])'

require 'json'
JSON.parse(jsonp[/{.+}/m])
# => {"detail1"=>"result1",
#     "detail2"=>"result2",
#     "Attr1"=>[{"detail1"=>"result1", "detail2"=>"result2"}],
#     "Attr2"=>[{"detail1"=>"result1", "detail2"=>"result2"}]}

你的JSONP样本有点受损,可能是试图缩短它,所以我把它清理成有效的JSON。

模式/{.+}/m告诉正则表达式引擎查找最外层花括号包含的所有内容,即JSON。 m标志告诉引擎将包含行尾的整个字符串视为长字符串,这在使用.时是必需的,因为它通常不会匹配行尾。那时你将拥有JSON内容,因此将其解析回Ruby对象是一件简单的事情。