您的位置:

json.parseobject()的使用详解

一、jsonparseobject泛型

public static <T> T parseObject(String json, Class<T> clazz)

json.parseobject()是阿里巴巴fastjson中的一个方法,其中最重要的参数是json字符串和要转换成的类类型Class<T>,使用这个方法可以将一个JSON字符串转换成指定的java对象

clazz是一个泛型,和json字符串的格式对应,即如果json字符串的格式对应一个java对象,那么就能通过反射构建一个对象,把json字符串中的值填充到这个对象属性中。如果json字符串不是一个标准的json格式,或者json字符串中的属性名在clazz对应的java对象中不存在,都会引起异常。

比如下面的代码,将json字符串转换成一个Person对象:

public class Person {
    private String name;
    private int age;
    private boolean male;
    // getter, setter
}

String jsonStr = "{\"name\":\"Tom\",\"age\":25,\"male\":true}";
Person person = JSON.parseObject(jsonStr, Person.class);

其中的json字符串是一个键值对的格式,对应clazz中Person类的成员变量,最终生成的person对象的属性值如下:

person.name = "Tom";
person.age = 25;
person.male = true;

二、jsonparseobject转对象

public static JSONObject parseObject(String text)

JSON.parseObject()方法还可以将json字符串转换成JSONObject对象。

JSONObject是一个JavaBean,可以使用getter和setter方法获取和设置不同类型的数据,比如字符串、数字等等。与普通的Java对象不同的是,JSONObject的属性名和属性值不需要在定义时指定,而是在使用getter和setter方法时传入。一个JSONObject对象通常用于封装一个json字符串的某一部分数据。

下面是一个使用JSON.parseObject()方法将json字符串转换成JSONObject对象的例子:

String jsonStr = "{\"name\":\"Tom\",\"age\":25,\"male\":true}";
JSONObject jsonObj = JSON.parseObject(jsonStr);
System.out.println(jsonObj.getString("name")); // "Tom"
System.out.println(jsonObj.getIntValue("age")); // 25
System.out.println(jsonObj.getBooleanValue("male")); // true

三、jsonparseobject转对象报错

在使用json.parseobject()方法时,有可能会遇到转换异常的情况,这时候需要根据错误信息来分析原因。

一种常见的错误是:反射时找不到某一个属性,则调用返回null,而null无法转换成基本数据类型或者对象类型,导致异常。

下面是一个在使用json.parseobject()方法时出现异常的例子:

public class User {
    private String username;
    private int age;
    // getter, setter
}

String jsonStr = "{\"username\":\"Tom\"}";
User user = JSON.parseObject(jsonStr, User.class);

运行上述代码会抛出一个“java.lang.NumberFormatException: null”的异常,原因是json字符串中缺少age属性,且age为int类型,没有默认值。为了避免这种异常,可以给age属性设置默认值,如下:

public class User {
    private String username;
    private int age = 0; // 设置默认值
    // getter, setter
}

String jsonStr = "{\"username\":\"Tom\"}";
User user = JSON.parseObject(jsonStr, User.class);
System.out.println(user.getAge()); // 0

四、jsonparseobject转换map报错

json.parseobject()方法还可以将json字符串转换成Map对象。但是在转换过程中,如果属性名为null或者"",在java中这些属性将不能作为Map的key值。因此,可能会出现“java.lang.NullPointerException”异常。

为了避免这种异常,可以将属性名为null或者""的属性移除,或者从json字符串中删除这些属性。

下面是一个在使用json.parseobject()方法时出现异常的例子:

String jsonStr = "{\"name\":\"Tom\",\"\":23}";
Map<String, Object> map = JSON.parseObject(jsonStr, new TypeReference<Map<String, Object>>(){});

运行上述代码会抛出一个“java.lang.NullPointerException”的异常,原因是json字符串中出现了空字符串""的属性名。为了避免这种异常,可以使用remove方法移除属性名为null或者""的属性:

String jsonStr = "{\"name\":\"Tom\",\"\":23}";
JSONObject jsonObj = JSON.parseObject(jsonStr);
jsonObj.remove("");
Map<String, Object> map = JSONObject.toJavaObject(jsonObj, new TypeReference<Map<String, Object>>(){});
System.out.println(map.get("name")); // Tom
System.out.println(map.get("")); // null

五、总结

json.parseobject()是一个非常有用的方法,可以将json字符串转换成Java对象、JSONObject对象或者Map对象。在使用时,需要注意json字符串的格式是否符合要求,需要根据不同的情况调整泛型类型或者修改json字符串。