HttpClient请求数据后是json字符串,需要我们自己把Json字符串反序列化为对象,我们会使用JacksonJson工具来实现。
JacksonJson是SpringMVC内置的json处理工具,其中有一个ObjectMapper类,可以方便的实现对json的处理:
1.对象转jsonimport com.fasterxml.jackson.databind.ObjectMapper;
import com.leyou.httpdemo.pojo.User;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit4.SpringRunner;
import java.io.IOException;
@RunWith(SpringRunner.class)
@SpringBootTest
public class JacksonJsonTests {
// json处理工具
private ObjectMapper mapper = new ObjectMapper();
@Test
public void tetsJson() throws IOException{
User user = new User();
user.setId(3L);
user.setAge(23);
user.setName("小明");
user.setUserName("xiaoming");
//序列化
String json = mapper.writeValueAsString(user);
System.out.println("json = " + json);
}
}
结果:
// json处理工具
private ObjectMapper mapper = new ObjectMapper();
@Test
public void tetsJsonToObject() throws IOException{
User user = new User();
user.setId(3L);
user.setAge(23);
user.setName("小明");
user.setUserName("xiaoming");
//序列化
String json = mapper.writeValueAsString(user);
System.out.println("json = " + json);
// 反序列化
final User result = mapper.readValue(json, User.class);
System.out.println("result = " + result);
}
结果:
json转集合比较麻烦,因为你无法同时把集合的class和元素的class同时传递到一个参数。
因此Jackson做了一个类型工厂,用来解决这个问题:
// json处理工具
private ObjectMapper mapper = new ObjectMapper();
@Test
public void tetsJsonToList() throws IOException{
User user = new User();
user.setId(3L);
user.setAge(23);
user.setName("小明");
user.setUserName("xiaoming");
//序列化得到对象集合的字符串
String json = mapper.writeValueAsString(Arrays.asList(user, user));
// 反序列化
List<User> users = mapper.readValue(json, mapper.getTypeFactory().constructCollectionType(List.class, User.class));
for (User u : users){
System.out.println("u = " + u);
}
}
结果:
当对象泛型关系复杂时,类型工厂也不好使了。这个时候Jackson提供了TypeReference来接收类型泛型,然后底层通过反射来获取泛型上的具体类型。实现数据转换。
@Test
public void tetsJsonToList() throws IOException{
User user = new User();
user.setId(3L);
user.setAge(23);
user.setName("小明");
user.setUserName("xiaoming");
//序列化得到对象集合的字符串
String json = mapper.writeValueAsString(Arrays.asList(user, user));
// 反序列化,接收两个参数:json数据,反序列化的目标类字节码
List<User> users = mapper.readValue(json, new TypeReference<List<User>>(){});
for (User u : users){
System.out.println("u = " + u);
}
}
结果: