因为这个项目一直在用IE8开发,所以经常遇到很多问题,最近呢,偶然遇到一个json的问题,虽然用evel()函数变形后可以转换,但是想看看其他的方法,所以就去度娘去治IE这个熊孩子了搜集到了一些方法,下面列举一下,并且在文章末尾都加上了原文出处
先说一下JAVA的
一、JASSONArray转为JSONObject
JSONArray result_type = new JSONArray();
StringBuffer cdsIdxType = new StringBuffer();
cdsIdxType.append(" select id from table_type ");
result_type = jdbcTemp.queryForJSONArray(cdsIdxType.toString());
JSONObject jsonObject = (JSONObject) result_type.get(i);
二、JASONArray转为List
JSONArray result_type = new JSONArray();
StringBuffer cdsIdxType = new StringBuffer();
cdsIdxType.append(" select id from table_type ");
result_type = jdbcTemp.queryForJSONArray(cdsIdxType.toString());
ArrayList list_type = new ArrayList();
for (int i = 0; i < result_type.size(); i++) {
JSONObject jsonObject = (JSONObject) result_type.get(i);
list_type.add(jsonObject.get("id"));
}
三、JSONArray转为String
JSONArray result_type = new JSONArray();
StringBuffer cdsIdxType = new StringBuffer();
cdsIdxType.append(" select id from table_type ");
result_type = jdbcTemp.queryForJSONArray(cdsIdxType.toString());
String typeAll = "";
ArrayList list_type = new ArrayList();
for (int i = 0; i < result_type.size(); i++) {
JSONObject jsonObject = (JSONObject) result_type.get(i);
list_type.add(jsonObject.get("id"));
}
for(int j=0;j<list_type.size();j++){
typeAll = typeAll + "'" + list_type.get(j) + "'" + ",";
}
typeAll = typeAll.substring(0, typeAll.length() -1);
四、String转换为ArrayList
String tablecode = request.getParameter("tablecode");
tablecode = tablecode.substring(1, tablecode.length()-1).replace("\"", "");
String[] list = tablecode.split(",");
ArrayList tables = new ArrayList();
for(int i=0; i<list.length; i++){
tables.add(list[i]);
}
五.String转JSONObject
String jsonMese = "{\"语文\":\"88\",\"数学\":\"78\",\"计算机\":\"99\"}";
JSONObject myJson = JSONObject.fromObject(jsonMese);
六.String转JSONArray
String jsonMessage = "[{'num':'成绩', '外语':88, '历史':65, '地理':99, 'object':{'aaa':'1111','bbb':'2222','cccc':'3333'}}," + "{'num':'兴趣', '外语':28, '历史':45, '地理':19, 'object':{'aaa':'11a11','bbb':'2222','cccc':'3333'}}," + "{'num':'爱好', '外语':48, '历史':62, '地理':39, 'object':{'aaa':'11c11','bbb':'2222','cccc':'3333'}}]";
JSONArray myJsonArray = JSONArray.fromObject(jsonMessage);
七.String转数组
String string = "a,b,c"; String [] stringArr= string.split(","); //注意分隔符是需要转译
如果是"abc"这种字符串,就直接
String string = "abc" ; char [] stringArr = string.toCharArray(); //注意返回值是char数组 如果要返回byte数组就直接使用getBytes方法就ok了
String string = "abc" ; byte [] stringArr = string.getBytes();
八、数组转String
char[] data={a,b,c};
String s=new String(data);
原文出处:点击查看
---*******************************************************我是分割线**************************************************************---
下面简单说一下JS的
先说IE8的问题
起因:
JSON是包含在JScript 5.8中,而为了向下兼容ie8只有在文档模式是”Internet Explorer 8 Standards”的时候才使用JScripte 5.8,其他时候使用JScripte 5.7特性。因此如果文档模式没有声明为”Internet Explorer 8 Standards”,ie8是找不到JSON对象的。因为没有兼容到ie6/7,所以必然在ie6/7中,JSON会出现未定义的问题。我项目中采用的是方法1,完美解决。
解决方法:
引入定义json的文件json2.js,
下载地址:https://github.com/douglascrockford/JSON-js
引入包含json的jquery文件。
如果不用兼容到ie6/7,只需要声明”Internet Explorer 8 Standards”模式,方法如下:
- 在文档头中添加<meta http-equiv="X-UA-Compatible" content="IE=8" >
- 使用<!DOCTYPE>来声明文档
原文出处:点击查看3
---*********我是小分割线********---
在JS中JSON的转换问题以及方法
JSON(JavaScript Object Notation)是一种轻量级的数据交换格式。因为采用独立于语言的文本格式,也使用了类似于C语言家族的习惯,拥有了这些特性使使JSON称为理想的数据交换语言,作用是易于阅读和编写,同时也易于机器解析和生成(一般用于网络传输速率)。
(1)JSON.parse函数
作用:将json字符串转换成json对象。
语法:JSON. parse(text[,reviver]).
参数:text 必须;一个有效的json字符串。
reviver 可选。
返回值:一个对象或数组。
example:
(2)JSON.stringify()函数
作用:将json对象转换成json字符串。
语法:JSON.stringify(value [, replacer] [, space])
参数:value 必须;通常为对象或数组。
replacer 可选,用于转换结果的函数或者数组。
space 可选。向返回值 JSON 文本添加缩进、空格和换行符以使其更易于读取。
返回值:一个包含JSON文本的字符串。
example:
(3) eval()函数
作用:eval()函数可计算某个字符串,并执行其中的javascript表达式或要执行的语句。
语法:eval(string)
参数: string 必须,需要计算的字符串,其中含有要计算的javascript表达式或要执行的语句。
返回值:返回计算string的值,没有的话不做任何改变返回。
example:
使用eval()函数也可以将JSON字符串解析为对象,这个功能能完成JSON.parse()的功能,但是有不一样的地方,请看下面代码 :
不知道大家有木有注意到eval()还要用一对圆括号将字符串包起来,对此我寻找到比较好的解释就是:
原因:归结于eval本身的问题,由于json是以”{}”的方式来开始以及结束的,在JS中,它会被当成一个语句块来处理,所以必须强制性的将它转换成一种表达式。
解决方法:加上圆括号的目的是迫使eval函数在处理JavaScript代码的时候强制将括号内的表达式(expression)转化为对象,而不是作为语句(statement)来执 行。举一个例子,例如对象字面量{},如若不加外层的括号,那么eval会将大括号识别为JavaScript代码块的开始和结束标记,那么{}将会被认为是执行了一句空语 句。请看下列例子的不同:
======================================下面举一个在实际开发中的小例子================================
一:组合参数
二:传递参数
三 :解析参数
最后附上js中获取URL参数的共通方法getRequest()方法:
getRequest : function() {
var url = location.search; //获取url中"?"符后的字串
var theRequest = new Object();
if (url.indexOf("?") != -1) {
var str = url.substr(1);
strs = str.split("&");
for(var i = 0; i < strs.length; i ++) {
theRequest[strs[i].split("=")[0]]=unescape(strs[i].split("=")[1]);
}
}
return theRequest;
}
原文出处:点击查看1
---*********************************************************我也是分割线***************************************************************---
下面的这个文章是在JS中对JSON对象的辩证
(我感觉是这样的,暂时这样称呼好了)
前言
写这篇文章的目的是经常看到开发人员说:把字符串转化为JSON对象,把JSON对象转化成字符串等类似的话题,所以把之前收藏的一篇老外的文章整理翻译了一下,供大家讨论,如有错误,请大家指出,多谢。
正文
本文的主题是基于ECMAScript262-3来写的,2011年的262-5新规范增加了JSON对象,和我们平时所说的JSON有关系,但是不是同一个东西,文章最后一节会讲到新增加的JSON对象。
英文原文:http://benalman.com/news/2010/03/theres-no-such-thing-as-a-json/
我想给大家澄清一下一个非常普遍的误解,我认为很多JavaScript开发人员都错误地把JavaScript对象字面量(Object Literals)称为JSON对象(JSON Objects),因为他的语法和JSON规范里描述的一样,但是该规范里也明确地说了JSON只是一个数据交换语言,只有我们将之用在string上下文的时候它才叫JSON。
序列化与反序列化
2个程序(或服务器、语言等)需要交互通信的时候,他们倾向于使用string字符串因为string在很多语言里解析的方式都差不多。复杂的数据结构经常需要用到,并且通过各种各样的中括号{},小括号(),叫括号<>和空格来组成,这个字符串仅仅是按照要求规范好的字符。
为此,我们为了描述这些复杂的数据结构作为一个string字符串,制定了标准的规则和语法。JSON只是其中一种语法,它可以在string上下文里描述对象,数组,字符串,数字,布尔型和null,然后通过程序间传输,并且反序列化成所需要的格式。YAML和XML(甚至request params)也是流行的数据交换格式,但是,我们喜欢JSON,谁叫我们是JavaScript开发人员呢!
字面量
引用Mozilla Developer Center里的几句话,供大家参考:
- 他们是固定的值,不是变量,让你从“字面上”理解脚本。 (Literals)
- 字符串字面量是由双引号(")或单引号(')包围起来的零个或多个字符组成的。(Strings Literals)
- 对象字面量是由大括号({})括起来的零个或多个对象的属性名-值对。(Object Literals)
何时是JSON,何时不是JSON?
JSON是设计成描述数据交换格式的,他也有自己的语法,这个语法是JavaScript的一个子集。
{ "prop": "val" } 这样的声明有可能是JavaScript对象字面量也有可能是JSON字符串,取决于什么上下文使用它,如果是用在string上下文(用单引号或双引号引住,或者从text文件读取)的话,那它就是JSON字符串,如果是用在对象字面量上下文中,那它就是对象字面量。
// 这是JSON字符串
var foo = '{ "prop": "val" }';
// 这是对象字面量
var bar = { "prop": "val" };
而且要注意,JSON有非常严格的语法,在string上下文里{ "prop": "val" } 是个合法的JSON,但{ prop: "val" }和{ 'prop': 'val' }确实不合法的。所有属性名称和它的值都必须用双引号引住,不能使用单引号。另外,即便你用了转义以后的单引号也是不合法的,详细的语法规则可以到这里查看。
放到上下文里来看
大家伙可能嗤之以鼻:难道JavaScript代码不是一个大的字符串?
当然是,所有的JavaScript代码和HTML(可能还有其他东西)都是字符串,直到浏览器对他们进行解析。这时候.jf文件或者inline的JavaScript代码已经不是字符串了,而是被当成真正的JavaScript源代码了,就像页面里的innterHTML一样,这时候也不是字符串了,而是被解析成DOM结构了。
再次说一下,这取决于上下文,在string上下文里使用带有大括号的JavaScript对象,那它就是JSON字符串,而如果在对象字面量上下文里使用的话,那它就是对象字面量。
真正的JSON对象
开头已经提到,对象字面量不是JSON对象,但是有真正的JSON对象。但是两者完全不一样概念,在新版的浏览器里JSON对象已经被原生的内置对象了,目前有2个静态方法:JSON.parse用来将JSON字符串反序列化成对象,JSON.stringify用来将对象序列化成JSON字符串。老版本的浏览器不支持这个对象,但你可以通过json2.js来实现同样的功能。
如果还不理解,别担心,参考一下的例子就知道了:
// 这是JSON字符串,比如从AJAX获取字符串信息
var my_json_string = '{ "prop": "val" }';
// 将字符串反序列化成对象
var my_obj = JSON.parse( my_json_string );
alert( my_obj.prop == 'val' ); // 提示 true, 和想象的一样!
// 将对象序列化成JSON字符串
var my_other_json_string = JSON.stringify( my_obj );
另外,Paul Irish提到Douglas Crockford在JSON RFC里用到了“JSON object”,但是在那个上下文里,他的意思是“对象描述成JSON字符串”不是“对象字面量”。
更多资料
如果你想了解更多关于JSON的资料,下面的连接对你绝对有用:
- JSON specification
- JSON RFC
- JSON on Wikipedia
- JSONLint - The JSON Validator
- JSON is not the same as JSON
同步与推荐
本文已同步至目录索引:深入理解JavaScript系列
深入理解JavaScript系列文章,包括了原创,翻译,转载等各类型的文章,如果对你有用,请推荐支持一把,给大叔写作的动力。
一般返回json数据时用到
var plist= JSON.parse(JSON.stringify(data.relist));
原文出处:点击查看2