文章目录
前言
做项目的时候,遇到了好多关于Json转化的问题,比如
- java 对象、Json 字符串 与 Json对象的互相转化
- Json 对象做Get请求参数的编码问题
等等,以后再遇到什么问题,我再继续补充,实时更新。。。
原来每次遇到都要现找资料,这次做个笔记,总结一下。
我以springboot项目进行测试。
一、测试前准备
1. maven依赖
<!--fastjson-->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>1.2.12</version>
</dependency>
<!--junit 测试单元-->
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
</dependency>
2. User类(Java对象)
我这里使用的 lombok插件
package com.feng.bean;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.io.Serializable;
@Data
@NoArgsConstructor
@AllArgsConstructor
public class User implements Serializable {
private String name;
private String address;
private String passwd;
}
二、JSON的互相转换
1. Java 对象转换到 Json对象
java 对象转化至Json对象,需两步:
- 将java对象转换至Json字符串
- 将Json字符串转换至 Json 对象
package com.feng.json;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import com.feng.bean.User;
import org.junit.Test;
public class JsonTest {
@Test
public void javaobjToJsonobj() {
System.out.println("****************************** JavaBean 转成 Json对象 :三个方法************************************");
User user = new User("feng","济南","123");
JSONObject o = (JSONObject) JSONArray.toJSON(user);
System.out.println("方法1:java 对象通过 JSONArray.toJSON(user) 转换成 Json 对象(需强转)"+o);
Object o1 = JSONObject.toJSON(user);
System.out.println("方法2:java 对象通过 JSONObject.toJSON(user) 转换成 Json 对象(需强转)"+o1);
String s1 = JSON.toJSONString(user);
System.out.println("方法3.1:对象JSON.toJSONString(user) 通过转成的 json字符串:"+s1);
JSONObject jsonObject = JSONObject.parseObject(s1);
System.out.println("方法3.2:json字符串通过 JSONObject.parseObject(s1) 转换成 json 对象:"+jsonObject);
//JSONObject json1 = JSONObject.parseObject(user.toString());
// System.out.println("111:"+json1);
/**
* 会报错 syntax error, pos 1 语法错误。
* 将对象转成 json 对象 需要两步:1、对象转成 json 字符串,2、json 字符串转成 json 对象
* 这里user.toString() 仅将对象转成字符串 而不是 json 字符串
*/
}
}
结果:
2. json 字符串转换成Json 对象
方法都在同一个类
@Test
public void jsonstrToJsonobj(){
System.out.println("****************************** Json字符串 转成 Json对象:两个方法 ************************************");
String s = "{\"address\":\"济南\",\"passwd\":\"123\",\"name\":\"feng\"}";
JSONObject json = JSONObject.parseObject(s);
System.out.println("方法1:json字符串通过JSONObject.parseObject() 转成json对象:"+json);
JSONObject parse = (JSONObject) JSONObject.parse(s);
System.out.println("方法2:json字符串通过JSONObject.parse() 转成json对象(需要强转):"+parse);
}
总结:
- 两个方法都可以,但是第二个方法需要强转。
3. Json字符串转换至Java对象
@Test
public void jsonstrToUserobj(){
System.out.println("****************************** Json字符串 转成 Java对象:两个方法 ************************************");
String s1 = "{\"address\":\"济南\",\"passwd\":\"123\",\"name\":\"feng\"}";
System.out.println("Json 字符串为:"+s1);
User user = JSONObject.parseObject(s1, User.class);
System.out.println("json字符串通过 转换至java对象:"+user.toString());
}
4. map 集合转换为 Json 对象
@Test
public void mapToJsonobj(){
System.out.println("****************************** map 集合转换为 Json 对象 ************************************");
Map<String, Object> map = new HashMap<>();
map.put("1","feng");
map.put("2",23);
map.put("3","济南");
System.out.println("map 集合通过 map.toString() 转换成 字符串:"+map.toString());
JSONObject jsonObject = (JSONObject) JSONObject.toJSON(map);
System.out.println("map 集合通过 JSONObject.toJSON(map) 转换成 Json对象(需强转):"+jsonObject);
}
5. 遍历JSONArray
@Test
public void readJsonarray() {
String strData = "[{\"name\":\"zhangsan\"},{\"name\":\"fenganchen\"}]";
JSONArray jsons = JSONArray.parseArray(strData); // 首先把字符串转成 JSONArray 对象
System.out.println("方法 1:直接使用for 循环的遍历");
if (jsons.size() > 0) {
for (int i = 0; i < jsons.size(); i++) {
JSONObject job = jsons.getJSONObject(i); // 遍历 jsonarray 数组,把每一个对象转成 json 对象
System.out.println(job.get("name")); // 得到 每个对象中的属性值
}
}
System.out.println("方法 2:for循环遍历的技巧");
if (jsons.size() > 0) {
for (Iterator tor = jsons.iterator(); tor.hasNext(); ) {
JSONObject job = (JSONObject) tor.next();
System.out.println(job.get("name"));
}
}
}
三、JSON的其他问题
1. JSON作为Get请求方法的参数
问题描述:
java.net.URISyntaxException: Illegal character in query at index 46
// 即:java.net.urisyntaxception:索引46处的查询中存在非法字符
我再微服务中底层发送一个get请求,请求参数为json,url为:String url111 = url+"?Condition="+json。
但是报错了。纠结。
搞了一上午,查阅资料发现。传参时,不能有特殊字符,如:{、/、||等等。
当然我这里也没有,但是json中的 { [,
等 就不行,因此需要转码。
Java jdk 有自带的方法,我直接放上:
解决方法:
java中转码:String encode = URLEncoder.encode(JSONObject.toJSONString(json),"UTF-8")
js中转码:var str = encodeURI(JSON.stringify(json),'utf-8')
则请求可使用了。
来源:CSDN
作者:冯insist
链接:https://blog.csdn.net/qq_40036754/article/details/103569218