浅谈JSON的数据交换、缓存问题和同步问题

作者:人圭先生 时间:2021-08-08 09:31:25 

JSON轻量级的数据交换格式

相对于XML来说,JSON的解析速度更快,文档更小。

JSON的格式

{属性名:属性值,属性名:属性值,……}

属性名的类型可以是string,number,boolean,null,object,且属性名必须用双引号引起来,如果属性值是字符串,也必须用双引号括起来。

JSON表示数组

格式:[value,value,value],其中value可以是基本的数据类型,也可以是object类型、数组类型


数组类型

[
{“name”:”yangjq”,”age”:22},
{“name”:”andreny”,”age”:21}
];

对象类型

[
“name”:”andreny”,
“hobby”:[“sing”,”dance”,”eat”]
]

转换


graph LR
JSON字符串-->JavaScript对象

1.使用JavaScript的原生函数:eval(),不过此方法有危险,使用需谨慎。


var str={"name":"yangjq","age":23};
var obj=eval("("+str+")");
alert(obj.name);

2.使用原生对象JSON提供的parse()方法,如果这个对象无效,说明你浏览器版本太低了!!!


var str={"name":"andreny","age":22};
var obj=JSON.parse(str);
alert(obj.name);

3.使用JSON.js文件为字符串增加的方法。


var str={"name":"逗比的二哈","age":9};
var obj=str.parseJSON();
alert(obj.name);

JSON对象转换为JSON字符串


graph LR
JSON对象-->JSON字符串

利用JSON官方提供的API:JSONObject,JSONArray提供的方法


//第一种方式
Emp emp=new Emp("1","andreny","man");
JSONObject obj=JSONObject.fromObject(emp);
String jsonStr=obj.toString();

//第二种方式
var obj={"name":"yangjq","age":23};
var str1=obj.toJSONString();
//第三种方式
var str2=obj.JSON.stringify();

AJAX在发送请求时涉及的缓存问题

==注==:IE浏览器提供的AJAX对象在发送请求时会先检查是否访问过该地址,如果访问过,那么浏览器就不再发送请求。

不同浏览器对待缓存的机制

Chrome 继续发送请求
Firefox 继续发送请求
IE浏览器 不再发送请求

怎么防止浏览器因为缓存而不发送请求呢?

在请求地址后面添加一个随机数


xhr.open('get','getNumber.do?+Math.random(),true);

发送post请求

关于同步的一些问题

在发送同步请求后,浏览器要等待服务器的响应到达后才能继续在页面中操作。AJAX在发送同步请求的时候,浏览器会锁定当前页面。

测试代码


package yangjq.test;
import java.util.ArrayList;
import java.util.List;
import net.sf.json.JSONArray;
import net.sf.json.JSONObject;
import yangjq.entity.Friend;
public class JSONtest {
public static void main(String[] args) {
System.out.println("---------------");
test1();
test2();
test3();
test4();
}
// java对象转换为json字符串
public static void test1(){
Friend f=new Friend();
f.setName("andreny");
f.setAge(23);
JSONObject obj=JSONObject.fromObject(f);
System.out.println(obj.toString());
}
// JSON集合转换为JSON字符串
public static void test2(){
List<Friend> fs=new ArrayList<Friend>();
for (int i=0;i<10;i++){
Friend f=new Friend();
f.setName("yangjq"+i);
f.setAge(12+i);
fs.add(f);
}
JSONArray ja=JSONArray.fromObject(fs);
System.out.println("-----JSON集合转换为JSON字符串------\n"+fs);
System.out.println(ja.toString());
}
// JSON字符串转换为java对象
public static void test3(){
String jsonStr="{\"name\":\"andreny\",\"age\":22}";
JSONObject obj=JSONObject.fromObject(jsonStr);
Friend friend=(Friend) JSONObject.toBean(obj,Friend.class);
System.out.println("-------JSON字符串转换为java对象------\n"+obj.toString());
System.out.println(friend);
}
// JSON字符串转换为java集合
public static void test4(){
String jsonStr="[{\"name\":\"yangjq\",\"age\":22}," +
       "{\"name\":\"andreny\",\"age\":23}]";
JSONArray obj=JSONArray.fromObject(jsonStr);
List<Friend> friends=(List<Friend>) JSONArray.toCollection(obj,Friend.class);
System.out.println("--------JSON字符串转换为java集合---------");
for (Friend f:friends){
System.out.println(f);
}
}
}

运行结果:


---------------
{"age":23,"name":"andreny"}
-----JSON集合转换为JSON字符串------
[Friend [name=yangjq0, age=12], Friend [name=yangjq1, age=13], Friend [name=yangjq2, age=14], Friend [name=yangjq3, age=15], Friend [name=yangjq4, age=16], Friend [name=yangjq5, age=17], Friend [name=yangjq6, age=18], Friend [name=yangjq7, age=19], Friend [name=yangjq8, age=20], Friend [name=yangjq9, age=21]]
[{"age":12,"name":"yangjq0"},{"age":13,"name":"yangjq1"},{"age":14,"name":"yangjq2"},{"age":15,"name":"yangjq3"},{"age":16,"name":"yangjq4"},{"age":17,"name":"yangjq5"},{"age":18,"name":"yangjq6"},{"age":19,"name":"yangjq7"},{"age":20,"name":"yangjq8"},{"age":21,"name":"yangjq9"}]
-------JSON字符串转换为java对象------
{"name":"andreny","age":22}
Friend [name=andreny, age=22]
--------JSON字符串转换为java集合---------
Friend [name=yangjq, age=22]
Friend [name=andreny, age=23]

来源:http://blog.csdn.net/sinat_15274667/article/details/51468883

标签:json,数据交换,缓存,同步
0
投稿

猜你喜欢

  • JavaMail入门教程之解析邮件(5)

    2023-11-29 08:25:13
  • Mybatis环境配置及测试详解

    2023-11-24 07:06:25
  • String类型传递是值传递,char[]类型传递是引用传递的实现

    2022-06-01 09:33:44
  • Java中的静态内部类详解及代码示例

    2021-11-25 08:50:00
  • 关于在IDEA中SpringBoot项目中activiti工作流的使用详解

    2022-12-11 01:24:28
  • java中复杂查询sql语句该怎么写

    2021-06-20 01:25:24
  • Java语法基础之运算符学习笔记分享

    2021-12-18 02:13:17
  • Android中bindService基本使用方法概述

    2023-08-05 19:18:56
  • Java使用synchronized修饰方法来同步线程的实例演示

    2022-11-29 18:33:29
  • spring mvc中@PathVariable / 带斜杠方式获取

    2022-09-15 04:47:27
  • Android 清除SharedPreferences 产生的数据(实例代码)

    2023-07-06 15:48:52
  • Kotlin与java8的SAM转换对比(进阶)

    2023-05-15 11:50:35
  • 详解如何让Spring MVC显示自定义的404 Not Found页面

    2023-12-12 15:48:47
  • Springboot整合pagehelper分页功能

    2021-12-14 15:53:48
  • SpringBoot整合MyCat实现读写分离的方法

    2022-03-05 23:37:45
  • Java RateLimiter的限流详解

    2023-01-06 17:14:12
  • java 工厂模式的讲解及优缺点的介绍

    2022-02-05 10:57:09
  • C#Process的OutputDataReceived事件不触发问题及解决

    2023-08-12 19:22:41
  • SpringBoot 返回Json实体类属性大小写的解决

    2023-08-05 12:30:49
  • 浅谈Java生命周期管理机制

    2022-02-21 19:07:47
  • asp之家 软件编程 m.aspxhome.com