类中的属性是坚决不建议出现中文命名的(原因主要为,中文命名的属性在碰到乱码问题时,程序可能会崩掉)。
但是,如果上游传来的json字符串中有中文的key,在转换成Object的时候,不可避免地需要中文命名的属性,怎么办?
JSON串:
{
"sofa调用结果": "id",
"更多trace信息": {
"测试一下": "test"
}
}
反例(简化下,getter 和 setter 就不写了):
public class TestOut {
private String sofa调用结果;
private TestOrTest 更多trace信息;
}
public class TestOrTest {
private String 测试一下;
}
测试:
import com.alibaba.fastjson.JSONObject;
import com.alibaba.fastjson.TypeReference;public class Test {
public static void main(String[] args) {
String testStr = "{"sofa调用结果":"id","更多trace信息":{"测试一下":"test"}}";
TestOut testOut = JSONObject.parseObject(testStr, new TypeReference() {
});
System.out.println(JSONObject.toJSONString(testOut));
}
}
结果:
如上例一般,虽然能跑通,但极不合规;
参考了 属性重命名 @SerializedName 之后,改为如下(包含两个改动点,Bean中的属性需要加上注释,在对JosnStr进行解析的时候需要使用特定的解析方式)
JSON串(不变):
{
"sofa调用结果": "id",
"更多trace信息": {
"测试一下": "test"
}
}
正例(简化下,getter 和 setter 就不写了):
public class TestOut {
@SerializedName("sofa调用结果")
private String id;
@SerializedName("更多trace信息")
private TestOrTest moreInformation;
}
public class TestOrTest {
@SerializedName("测试一下")
private String test;
}
测试:
import com.google.gson.Gson;public class Test {
public static void main(String[] args) {
String testStr = "{"sofa调用结果":"id","更多trace信息":{"测试一下":"test"}}";
Gson gson = new Gson();
TestOut testOut = gson.fromJson(testStr, TestOut.class);
System.out.println(testOut.toString());
}
}
结果:
That's it.