一、javascript对象和json的相互转换
设置一个javascript对象
var obj = {
name:"kai",
age:2,
sex:"男"
};
1、js转json
var json = JSON.stringify(obj);
console.log(json);//控制台输出
结果
{“name”:“kai”,“age”:2,“sex”:“男”}
2、json转js
var js=JSON.parse(json);
console.log(js);
结果
Object
age: 2
name: “kai”
sex: “男”
二、java对象和json的相互转换
首先准备一个JavaBean类:
我是用的lombok插件,idea需要下载它的插件和导入依赖
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.10</version>
</dependency>
@Data//set get toString 等等方法
@AllArgsConstructor //全有参构造
@NoArgsConstructor //无参构造
public class User {
private String name;
private int age;
private String gender;
}
java对象和json的相互转换
json转java:mapper.readValue(json, User.class);
java转json:mapper2.writeValueAsString(user);
注意:在SpringMVC中@ResponseBody和@RequestMapping两个注解一定要写
package com.kai.Json;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.kai.pojo.User;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
import java.io.IOException;
@Controller
public class josnController1 {
@ResponseBody //表示不会走视图解析器,只返回一个字符串,作用于方法上
@RequestMapping(value = "/json1",produces = "application/json;charset=utf-8")//必须要设置produces要不然返回的json是乱码
public String jsonTest1() throws IOException {
//1.字符串转java对象 \转义字符表示有""
String json = "{\"name\":\"张三\",\"age\":22,\"gender\":\"男\"}";
// 需要jackson对象映射器 readValue
ObjectMapper mapper = new ObjectMapper();
User user1 = mapper.readValue(json, User.class);
System.out.println(user1);
//2.java对象转json 字符串
User user = new User("小凯",1,"男");
// 需要jackson对象映射器 writeValueAsString
ObjectMapper mapper2 = new ObjectMapper();
String s = mapper2.writeValueAsString(user);
System.out.println(s);
return s;
}
}
三、Json乱码问题
如图json乱码
有两种解决办法
-
第一种:可以看上面的代码josnController1类下的在每一个方法上都设置 @RequestMapping注解内的属性 produces=“application/json;charset=utf-8”
当类中的方法比较多的时候 这样写比较麻烦 -
第二种:在springmvc的配置文件内添加以下代码,并在Controller类上添加@RestController 此注解表示此类下的所有方法都返回字符串,不走视图解析器,很适合前后端分离。
<mvc:annotation-driven>
<mvc:message-converters register-defaults="true">
<bean class="org.springframework.http.converter.StringHttpMessageConverter">
<constructor-arg value="UTF-8"/>
</bean>
<bean class="org.springframework.http.converter.json.MappingJackson2HttpMessageConverter">
<property name="objectMapper">
<bean class="org.springframework.http.converter.json.Jackson2ObjectMapperFactoryBean">
<property name="failOnEmptyBeans" value="false"/>
</bean>
</property>
</bean>
</mvc:message-converters>
</mvc:annotation-driven>
@RestController //作用在类上:此类下的所有方法都返回字符串,不走视图解析器,适合前后端分离
public class jsonController2 {
@RequestMapping("/json2")
public String json2() throws JsonProcessingException {
//测试list数组
User user = new User("张三", 22, "女");
User user1 = new User("李四", 33, "男");
User user2 = new User("王五", 44, "男");
List<User> list = new ArrayList<User>();
list.add(user);
list.add(user1);
list.add(user2);
ObjectMapper mapper = new ObjectMapper();
String json = mapper.writeValueAsString(list);
return json;
}
}
结果如下
总结:
1、@RequestMapping(value = “”,produces = “application/json;charset=utf-8”)+@ResponseBody 写在方法上,代表此方法只返回字符串编码格式为utf-8,并且每个方法都要写这些
2、springmvcl配置(上面有)+@RestController 写在类上,表示此类下所有的方法都将返回字符串,很适合前后端分离
第二种更好用,@ResponseBody和@RestControlle都不会走视图解析器
四、Json自定义时间格式
方法一:直接在方法中自定义
@RequestMapping("/json3")
public String jsonTest() throws JsonProcessingException {
Date date = new Date();
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
String format = sdf.format(date);
//java对象转json
ObjectMapper mapper = new ObjectMapper();
String str = mapper.writeValueAsString(format);
return str;
}
方法二:多次需要调用时候封装成一个类
public class JsonDateUtil {
public static String getDataFormat(){
Date date = new Date();
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
String format = sdf.format(date);
//java对象转json
ObjectMapper mapper = new ObjectMapper();
String str = null;
try {
str = mapper.writeValueAsString(format);
} catch (JsonProcessingException e) {
e.printStackTrace();
}
return str;
}
}
调用只需要
@RequestMapping("/json4")
public String jsonTest4(){
return JsonDateUtil.getDataFormat();
}
方法三:当Date是JavaBean的属性时候可以直接使用注解@JsonFormat
@JsonFormat(pattern = "yyyy年--MM月--dd日")
private Date birthday;
五、阿里 FastJson的使用
fastjson.jar是阿里开发的一款专门用于Java开发的包,可以方便的实现json对象与JavaBean对象的转换,实现JavaBean对象与json字符串的转换,实现json对象与json字符串的转换。实现json的转换方法很多,最后的实现结果都是一样的。
fastjson 三个主要的类:
JSONObject 代表 json 对象
- JSONObject实现了Map接口, 猜想 JSONObject底层操作是由Map实现的。
JSONObject对应json对象,通过各种形式的get()方法可以获取json对象中的数据,也可利用诸如size(),isEmpty()等方法获取"键:值"对的个数和判断是否为空。其本质是通过实现Map接口并调用接口中的方法完成的。
JSONArray 代表 json 对象数组
- 内部是有List接口中的方法来完成操作的。
JSON代表 JSONObject和JSONArray的转化
JSON类源码分析与使用
- 仔细观察这些方法,主要是实现json对象,json对象数组,javabean对象,json字符串之间的相互转化。
依赖
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>1.2.60</version>
</dependency>
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import com.kuang.pojo.User;
import java.util.ArrayList;
import java.util.List;
public class FastJsonDemo {
public static void main(String[] args) {
//创建一个对象
User user1 = new User("秦疆1号", 3, "男");
User user2 = new User("秦疆2号", 3, "男");
User user3 = new User("秦疆3号", 3, "男");
User user4 = new User("秦疆4号", 3, "男");
List<User> list = new ArrayList<User>();
list.add(user1);
list.add(user2);
list.add(user3);
list.add(user4);
System.out.println("*******Java对象 转 JSON字符串*******");
String str1 = JSON.toJSONString(list);
System.out.println("JSON.toJSONString(list)==>"+str1);
String str2 = JSON.toJSONString(user1);
System.out.println("JSON.toJSONString(user1)==>"+str2);
System.out.println("\n****** JSON字符串 转 Java对象*******");
User jp_user1=JSON.parseObject(str2,User.class);
System.out.println("JSON.parseObject(str2,User.class)==>"+jp_user1);
System.out.println("\n****** Java对象 转 JSON对象 ******");
JSONObject jsonObject1 = (JSONObject) JSON.toJSON(user2);
System.out.println("(JSONObject) JSON.toJSON(user2)==>"+jsonObject1.getString("name"));
System.out.println("\n****** JSON对象 转 Java对象 ******");
User to_java_user = JSON.toJavaObject(jsonObject1, User.class);
System.out.println("JSON.toJavaObject(jsonObject1, User.class)==>"+to_java_user);
}
}