浅谈JSON的数据交换、缓存问题和同步问题
作者:人圭先生 发布时间:2021-08-08 09:31:25
标签:json,数据交换,缓存,同步
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


猜你喜欢
- 1、@Select注解基本用法@Select注解的目的是为了取代xml中的select标签,只作用于方法上面。下面看一下@Select注解的
- 在开源中国看到的操作ini文件的,写的还不看,留着以后用using System;using System.IO;using System.
- 获取map的值主要有四种方法,这四种方法又分为两类,一类是调用map.keySet()方法来获取key和value的值,另一类则是通过map
- 目录环境准备1.数据库操作1.1获取所有数据库1.2获取指定库的所有集合名1.3.删除数据库2.文档操作2.1插入文档2.2查询文档2.3分
- 最近项目中用到了文字图标的按钮,需要居中显示,如果用TextView实现的方式,必须同时设置padding和drawablePadding。
- 1、此文初衷平常我们在进行微服务开发完毕后,单个微服务理应部署单个虚机上(docker也可),然后服务集中发布到服务注册中心上,但是有些小的
- 前言我们在项目的开发中,难免会遇到各种可预知的、不可预知的异常需要处理。每个过程都单独处理异常,系统的代码耦合度高,工作量大且不好统一,维护
- 1)如何获得MediaPlayer实例:可以使用直接new的方式:MediaPlayer mp = new MediaPlayer();也可
- 目录问题为每个request设置超时值Http Handler给Request加上超时处理抛出正确的异常使用Handler总结HttpCli
- 动态数据源在很多具体应用场景的时候,我们需要用到动态数据源的情况,比如多租户的场景,系统登录时需要根据用户信息切换到用户对应的数据库。又比如
- 步骤,如图所示:1.添加异步任务业务类package top.ytheng.demo.task;import java.util.concu
- Java try()语句实现try-with-resources异常管理机制java7 新增特性,对于try语句块中使用到的资源,不再需要手
- 关于在Android中实现ListView的弹性效果,有很多不同的方法,网上一搜,也有很多,下面贴出在项目中经常用到的两种实现ListVie
- Java把内存分成两种,一种叫做栈内存,一种叫做堆内存在函数中定义的一些基本类型的变量和对象的引用变量都是在函数的栈内存中分配。
- 0. Grinder – Grinder是一个开源的JVM负载测试框架,它通过很多负载注射器来为分布式测试提
- .NETCORE 中的 Generic Host本文以自己在工作中学习和使用.net core generic-host 作一个总结。前言在
- 我们知道,当我们按返回或Home键退出应用程序的界面时,应用程序会在后台被挂起。这么设计的好处是,由于应用被系统缓存在内存中,那么在用户打开
- 概述Spring Cloud中,客户端的负载均衡使用的是Ribbon,Ribbon的超时时间默认很短,需要进行调整。Spring Cloud
- Netty是一个非常优秀的Socket框架。如果需要在SpringBoot开发的app中,提供Socket服务,那么Netty是不错的选择。
- 实现InsertOrUpdate功能需求最近在项目开发中遇到这样一个需求:每天需要对相同的数据(也有可能是不同的)进行两次入库操作,数据不存