使用过程
pom.xml中添加:
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>1.2.58</version>
</dependency>
代码:
public class JsonTest {
public static void main(String[] args) {
Map<Integer, Object> map = new HashMap<Integer,Object>();
ArrayList<Person> list = new ArrayList<Person>();
Person person = new JsonTest().new Person();
Person person2 = new JsonTest().new Person();
person.setName("张飞");
person.setAge("28");
person2.setName("guanyu");
person2.setAge("30");
list.add(person);
list.add(person2);
map.put(1, "String1");
map.put(2, "String2");
map.put(3, list);
String jsonString = JSON.toJSONString(map);
System.out.println(jsonString);
JSONObject jsonObject = JSON.parseObject(jsonString);
String string1 = jsonObject.getString("1");
String string2 = jsonObject.getString("2");
JSONArray list1 = jsonObject.getJSONArray("3");
System.out.println(list1);
System.out.println(list1.get(0));
}
class Person{
private String name;
private String age;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getAge() {
return age;
}
public void setAge(String age) {
this.age = age;
}
}
}
**对象 ==> jsonString **
JSON.toJSONString(map);
**jsonString ==> obj **
JSON.parseObject(jsonString);
当然也可以转换为某个类的对象,代码:
@Data
@Entity
public class Person {
private static final Logger logger = LoggerFactory.getLogger(Person.class);
@Id
private Long id;
private String name;
public static void main(String[] args) {
Person person = new Person();
person.setId(159L);
person.setName("chushiyun");
String s = JSON.toJSONString(person);
logger.info("json 字符串是:{}",s);
Person person1 = JSON.parseObject(s, Person.class);
logger.info(person1.toString());
}
}
如果字段有不一致的时候,那么可以加@JSONField
注解,序列化和解析的时候就会按照这个字段来解析,如代码:
@Data
@Entity
public class PersonManage {
@Id
private Long id;
@JSONField(name="name")
private String manageName;
}
拓展: JSON.parseObject一个空对象会报错吗?
好问题,一起来看一下。
JSON.parseObject一个空对象会报错吗?(null);
不会。
但是要注意,返回的是个null对象,如果继续调用方法,会报错。
用代码验证下:
// 这句不会报错
JSONObject jsonObject = JSON.parseObject(null);
// 这句会报错
// 因为之前返回的JsonObject是null,调用任何方法都会报错
String string = jsonObject.getString("username");
如果是Resource资源,使用Json序列化容易有问题
序列化之后,发现文件变成非正常文件了。
代码:
Path path = Paths.get("d:\\", filename);
Resource resource = resourceLoader.getResource("file:" + path.toString());
logger.info("resource:{}",JSON.toJSONString(resource)); // 都是这句json惹的祸,页面输出不了
目前还不知道原理,总之,在序列化Resource资源的时候要小心。
parseObject遇到的问题
解析复杂对象的时候直接使用parseObject会有问题,要用这种解析方式:
JsonResult<MultiModel> redisJsonResult = JSON.parseObject(jsonString, new TypeReference<JsonResult<MultiModel>>() {});
输出下划线格式
标准产品是下划线格式,日志也打印为下划线格式直接就能复用,否则还需要转您换。
public static void main(String[] args) {
SerializeConfig serializeConfig=new SerializeConfig();
serializeConfig.propertyNamingStrategy= PropertyNamingStrategy.SnakeCase;
User user= new User ();
user.setUsername("asdfad");
log.info(JSON.toJSONString(user,serializeConfig));
}
发现果然是下划线格式了。