fastjson将不同的字符串转换成带枚举的java对象时,不同的字符串值转换成java对象的结果不同;
测试用fastjson版本:
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>1.2.83</version>
</dependency>
测试用的java对象:
package test;
public enum E {
AAA,
BBB;
}
package test;
public class A {
public String abc;
public E e;
@Override
public String toString() {
return "A [abc=" + abc + ", e=" + e + "]";
}
}
测试类:
package test;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
public class Test {
public static void main(String[] args) {
System.out.println("start");
String s = "{\"abc\":\"TEST\",\"e\":\"AAA\"}";
JSONObject jobj = JSON.parseObject(s);
System.out.println(jobj.get("e"));
A a = JSON.toJavaObject(jobj, A.class);
System.out.println(a);
}
}
正常使用枚举的值字符串状态可以正常转换:
使用枚举中的数值也可以正常转换:
例如使用数值1,String s = "{\"abc\":\"TEST\",\"e\":1}";
但是使用枚举中不存在的字符串,就会返回null,没有该枚举的值也是null:
字符串改为,String s = "{\"abc\":\"TEST\",\"e\":\"XXXXXX\"}";
改为,String s = "{\"abc\":\"TEST\"}";
如果使用枚举中不存在的数值,则会直接抛出异常:
字符串改为,String s = "{\"abc\":\"TEST\",\"e\":100}";
改成对象也是一样的错误:
String s = "{\"abc\":\"TEST\",\"e\":{}}";
String s = "{\"abc\":\"TEST\",\"e\":{\"e\":1}}";
可以看到,不管何种情况,JSONObject都会获得对应的值,但是转换成java对应的对象时就会有不同结果,主要注意这个地方,尤其字符串来自未知的地方;