Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby 如何使用序列化格式清理JSON字符串?_Ruby_Json - Fatal编程技术网

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

Ruby 如何使用序列化格式清理JSON字符串?,ruby,json,Ruby,Json,我试图解码和解析API返回的字符串,但是返回的JSON对象的语法很奇怪 我可以从字符串中剥离元素,但我想知道清理这个JSON字符串并将其转换为Ruby哈希的最佳方法是什么 "DataCallBack([ { \"detail1\": \"result1\", \"detail2\": \"result2\", \"Attr1\": [ { \"detail1\": \"result1\

我试图解码和解析API返回的字符串,但是返回的JSON对象的语法很奇怪

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

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

只需在查询字符串中请求数据,而不使用
?callback=DataCallBack
,您可能会得到可以直接解析的原始JSON。

很容易从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对象即可。

这似乎只是序列化字符串。这并不“奇怪”,这是一个带引号的常规JSON字符串。有可能只是以这种方式呈现,而反斜杠实际上并不存在于字符串中;您是否尝试过
JSON.parse
?我认为这是一个序列化的JSONP字符串,但当我尝试
JSON.parse
decode
时,我在'DataCallBack…包装回调中得到了
JSON::parserror:795:意外的标记。您确定没有
DataCallBack
包装回调就无法获得版本吗?JSONP实际上只设计用于javascript。大多数支持JSONP的API也支持原始JSON。因此,如果您是从服务器而不是从AJAX查询API,通常不会传递
回调
参数并获取可以直接解析的原始JSON。JSONP只是一种允许在浏览器中跨域获取数据的变通方法。