来自 JSON website :
JSON is built on two structures:
- A collection of name/value pairs. In various languages, this is realized as an object, record, struct, dictionary, hash table, keyed list, or associative array.
- An ordered list of values. In most languages, this is realized as an array, vector, list, or sequence.
现在我有一个返回 bool 值的示例服务(这是在 PHP 中,但它可以是任何服务器端语言):
<?php
header('Content-Type: application/json');
echo 'true';
exit;
当使用 ajax 请求此页面时(例如使用 jQuery):
$.ajax({
url: 'service.php',
dataType: 'json',
success: function (data) {
console.log(data);
console.log(typeof data);
}
});
结果是:
-> true
-> boolean
我的问题是为什么允许将 boolean 作为 JSON 返回。 不会和JSON定义冲突吗?
我也可以在我的服务中返回number或string:
<?php
header('Content-Type: application/json');
echo '2013';
exit;
结果是:
-> 2013
-> number
对于字符串:
<?php
header('Content-Type: application/json');
echo '"What is going on?"';
exit;
结果是:
-> What is going on?
-> string
最佳答案
您是正确的,有效的 JSON 文本只能是对象或数组。我在 2009 年就此问题询问了道格拉斯·克罗克福德,他证实了这一点,并说“严格来说,它是对象|数组,就像在 RFC 中一样。”
JSON RFC在第 2 节中指定:
A JSON text is a serialized object or array.
JSON-text = object / array
json.org 中列出的原始 JSON 语法根本没有说清楚。它定义了所有 JSON 类型,但没有说明这些类型中的哪些类型可以用作“JSON 文本”——完整有效的 JSON 片段。
这就是为什么我向 Doug 询问了这件事,他让我引用了 RFC。不幸的是,他没有按照我的建议更新 json.org 来澄清这一点。
可能由于这种混淆,许多 JSON 库将愉快地为独立的字符串、数字、 bool 值等创建和解析(无效的)JSON,即使它们不是真正有效的 JSON。
一些 JSON 解析器更严格。例如,jsonlint.com拒绝 JSON 文本,例如 101、"abc" 和 true。它只接受对象或数组。
如果您只是生成 JSON 数据供您自己的网络应用程序使用,那么这种区别可能并不重要。毕竟,JSON.parse() 很乐意解析它,这可能适用于所有浏览器。
但是,如果您曾经生成 JSON 供其他人使用,则这一点很重要。在那里你应该更严格地遵循标准。
我建议即使在您自己的应用程序中也遵循它,部分原因是它有一个实际好处:通过发送一个对象而不是一个裸字符串,您有一个内置的地方可以在需要时添加更多信息,在对象中附加属性的形式。
按照这些思路,当我定义 JSON API 时,我从不在最顶层使用数组。如果我拥有的是某种项目的数组,我仍然将其包装在一个对象中:
{
"items": [
...
]
}
这在一定程度上是出于同样的原因:如果我以后想向响应中添加其他内容,将顶层作为对象可以很容易地做到这一点,而不会破坏任何现有的客户端代码。
也许更重要的是,还有一个可能的 security risk with JSON arrays . (我认为风险只会影响eval() 或Function 构造函数解析 JSON 的使用,所以使用 JSON.parse(),但我对此不是 100% 确定。)
关于javascript - 为什么 JSON 结果可以是 bool 值而不是对象或数组?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16955215/
总的来说,我对ruby还比较陌生,我正在为我正在创建的对象编写一些rspec测试用例。许多测试用例都非常基础,我只是想确保正确填充和返回值。我想知道是否有办法使用循环结构来执行此操作。不必为我要测试的每个方法都设置一个assertEquals。例如:describeitem,"TestingtheItem"doit"willhaveanullvaluetostart"doitem=Item.new#HereIcoulddotheitem.name.shouldbe_nil#thenIcoulddoitem.category.shouldbe_nilendend但我想要一些方法来使用
类classAprivatedeffooputs:fooendpublicdefbarputs:barendprivatedefzimputs:zimendprotecteddefdibputs:dibendendA的实例a=A.new测试a.foorescueputs:faila.barrescueputs:faila.zimrescueputs:faila.dibrescueputs:faila.gazrescueputs:fail测试输出failbarfailfailfail.发送测试[:foo,:bar,:zim,:dib,:gaz].each{|m|a.send(m)resc
我有一个模型:classItem项目有一个属性“商店”基于存储的值,我希望Item对象对特定方法具有不同的行为。Rails中是否有针对此的通用设计模式?如果方法中没有大的if-else语句,这是如何干净利落地完成的? 最佳答案 通常通过Single-TableInheritance. 关于ruby-on-rails-Rails-子类化模型的设计模式是什么?,我们在StackOverflow上找到一个类似的问题: https://stackoverflow.co
在控制台中反复尝试之后,我想到了这种方法,可以按发生日期对类似activerecord的(Mongoid)对象进行分组。我不确定这是完成此任务的最佳方法,但它确实有效。有没有人有更好的建议,或者这是一个很好的方法?#eventsisanarrayofactiverecord-likeobjectsthatincludeatimeattributeevents.map{|event|#converteventsarrayintoanarrayofhasheswiththedayofthemonthandtheevent{:number=>event.time.day,:event=>ev
我正在使用的第三方API的文档状态:"[O]urAPIonlyacceptspaddedBase64encodedstrings."什么是“填充的Base64编码字符串”以及如何在Ruby中生成它们。下面的代码是我第一次尝试创建转换为Base64的JSON格式数据。xa=Base64.encode64(a.to_json) 最佳答案 他们说的padding其实就是Base64本身的一部分。它是末尾的“=”和“==”。Base64将3个字节的数据包编码为4个编码字符。所以如果你的输入数据有长度n和n%3=1=>"=="末尾用于填充n%
我主要使用Ruby来执行此操作,但到目前为止我的攻击计划如下:使用gemsrdf、rdf-rdfa和rdf-microdata或mida来解析给定任何URI的数据。我认为最好映射到像schema.org这样的统一模式,例如使用这个yaml文件,它试图描述数据词汇表和opengraph到schema.org之间的转换:#SchemaXtoschema.orgconversion#data-vocabularyDV:name:namestreet-address:streetAddressregion:addressRegionlocality:addressLocalityphoto:i
使用带有Rails插件的vim,您可以创建一个迁移文件,然后一次性打开该文件吗?textmate也可以这样吗? 最佳答案 你可以使用rails.vim然后做类似的事情::Rgeneratemigratonadd_foo_to_bar插件将打开迁移生成的文件,这正是您想要的。我不能代表textmate。 关于ruby-使用VimRails,您可以创建一个新的迁移文件并一次性打开它吗?,我们在StackOverflow上找到一个类似的问题: https://sta
为什么4.1%2返回0.0999999999999996?但是4.2%2==0.2。 最佳答案 参见此处:WhatEveryProgrammerShouldKnowAboutFloating-PointArithmetic实数是无限的。计算机使用的位数有限(今天是32位、64位)。因此计算机进行的浮点运算不能代表所有的实数。0.1是这些数字之一。请注意,这不是与Ruby相关的问题,而是与所有编程语言相关的问题,因为它来自计算机表示实数的方式。 关于ruby-为什么4.1%2使用Ruby返
查看Ruby的CSV库的文档,我非常确定这是可能且简单的。我只需要使用Ruby删除CSV文件的前三列,但我没有成功运行它。 最佳答案 csv_table=CSV.read(file_path_in,:headers=>true)csv_table.delete("header_name")csv_table.to_csv#=>ThenewCSVinstringformat检查CSV::Table文档:http://ruby-doc.org/stdlib-1.9.2/libdoc/csv/rdoc/CSV/Table.html
我有一个表单,其中有很多字段取自数组(而不是模型或对象)。我如何验证这些字段的存在?solve_problem_pathdo|f|%>... 最佳答案 创建一个简单的类来包装请求参数并使用ActiveModel::Validations。#definedsomewhere,atthesimplest:require'ostruct'classSolvetrue#youcouldevencheckthesolutionwithavalidatorvalidatedoerrors.add(:base,"WRONG!!!")unlesss