java与javascript中处理json的区别
本文由 小茗同学 发表于 2016-07-27 浏览(4917)
最后修改 2016-08-02 标签:javascript java json 区别 undefined 单引号

双引号与单引号

一般而言,java中的json转换工具(如gson、jackson)只能处理标准json,所谓标准json,就是键值和字符串都必须用双引号包裹的json字符串:

var json1 = '{"a": "abc"}'; // 标准JSON
var json2 = "{a: 'abc'}"; // 非标准JSON
var json3 = '{a: "abc"}'; // 非标准JSON
var json4 = '{"a": \'abc\'}'; // 非标准JSON

由于js要求不严格,在js中书写对象时,以下格式都是可以的:

var obj = {a: 'abc'};
var obj = {'a': 'abc'};
var obj = {"a": "abc"};

而对于解析json字符串来说,js自带的JSON.parse和java的常见json转换工具都只能处理标准json,js要解析非标准json字符串,可以使用eval:

// 使用eval解析非标准json字符串
var json = "{a: 'abc'}";
console.log(eval('('+json+')'));

当然,我们并不推荐这么做,因为实际使用中还是建议大家尽量使用标准json,毕竟这样在各个语言中都比较统一。

undefined的处理

var str = '{"cbid":1,"data":undefined}';
JSON.parse(str); // Uncaught SyntaxError: Unexpected token u(…)

为了验证,我们再试一次:

var obj = {"cbid":1,"data":undefined};
JSON.stringify(obj); // 输出:'{"cbid":1}'

可以发现,json对象转字符串的时候会自动过滤掉undefined的内容,之所以这么做,我觉得最主要是因为undefined是JavaScript特有的对象,在其它语言中(比如Java)并不存在undefined,为了统一,所以还是过滤掉为妙。

当然,使用eval解析带undefined的json字符串时是不会有问题的。