我尝试解码并解析API返回的字符串,但返回的JSON对象的语法很奇怪。
我可以从字符串中删除元素,但是想知道清理这个JSON字符串并将其转换为Ruby哈希的最佳方法是什么?
"DataCallBack([
{
\"detail1\": \"result1\",
\"detail2\": \"result2\",
\"Attr1\": [
{
\"detail1\": \"result1\",
\"detail2\": \"result2\",
},
{...}
]
],
\"Attr2\": [
{
\"detail1\": \"result1\",
\"detail2\": \"result2\",
},
{...}
]
}
])"
答案 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对象是一件简单的事情。