我在一个旧的Rails应用程序(3.2.22)中使用Test :: Unit,我正在尝试测试一个命中外部api的服务类。
我正在使用webmock并试图让json文件夹具正常工作,但我不断从json文件中解析错误。
我的测试存根看起来像这样:
response_data = fixture_file_upload('easypost/order_response.json')
stub_request(:post, 'https://api.easypost.com/v2/orders').
to_return(:status => 200, :body => File.read(response_data))
我的order_response.json
文件如下所示:
{
'mode':'test',
'reference':'Order',
'is_return':false,
'options':{'currency':'USD','label_date':null}
}
当我运行测试时,我得到一个解析错误:
JSON::ParserError: 757: unexpected token at '{'mode':'test','reference':'Order','is_return':false,'options':{'currency':'USD','label_date':null}}'
发生了什么事?
更新
通过在JSON文件中使用双引号来实现它:
{
"mode":"test",
"reference":"Order",
"is_return":false,
"options":{"currency":"USD","label_date":null}
}
有人能解释为什么这是必要的吗?
答案 0 :(得分:1)
string 是零个或多个Unicode字符的序列,用双引号括起来,使用反斜杠转义。
和 object 是一组键/值对,其中键是字符串:
这意味着:
{
'mode':'test',
'reference':'Order',
'is_return':false,
'options':{'currency':'USD','label_date':null}
}
不是JSON,因为JSON字符串使用双引号而只使用双引号,这只是看起来像JSON的东西。切换到字符串的双引号时:
{
"mode":"test",
"reference":"Order",
"is_return":false,
"options":{"currency":"USD","label_date":null}
}
然后你有JSON,一切都应该有用。
答案 1 :(得分:0)
这是为了简化并避免为javascript保留关键字提供另一种转义方法
我认为这篇文章可能有助于理解报价的必要性(以及我发现上述报价的地方):JSON Spec - does the key have to be surrounded with quotes?