如果类的属性需要中文名怎么办
类中的属性是坚决不建议出现中文命名的(原因主要为,中文命名的属性在碰到乱码问题时,程序可能会崩掉)。
但是,如果上游传来的json字符串中有中文的key,在转换成Object的时候,不可避免地需要中文命名的属性,怎么办?
JSON串:
<pre class="cm-s-default" style="color: rgb(89, 89, 89); margin: 0px; padding: 0px; background: none 0% 0% / auto repeat scroll padding-box border-box rgba(0, 0, 0, 0);">{
"sofa调用结果": "id",
"更多trace信息": {
"测试一下": "test"
}
}</pre>
反例(简化下,getter 和 setter 就不写了):
<pre class="cm-s-default" style="color: rgb(89, 89, 89); margin: 0px; padding: 0px; background: none 0% 0% / auto repeat scroll padding-box border-box rgba(0, 0, 0, 0);">public class TestOut {
private String sofa调用结果;
private TestOrTest 更多trace信息;
}</pre>
<pre class="cm-s-default" style="color: rgb(89, 89, 89); margin: 0px; padding: 0px; background: none 0% 0% / auto repeat scroll padding-box border-box rgba(0, 0, 0, 0);">public class TestOrTest {
private String 测试一下;
}</pre>
测试:
<pre class="cm-s-default" style="color: rgb(89, 89, 89); margin: 0px; padding: 0px; background: none 0% 0% / auto repeat scroll padding-box border-box rgba(0, 0, 0, 0);">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<TestOut>() {
});
System.out.println(JSONObject.toJSONString(testOut));
}
}</pre>
结果:
image.png如上例一般,虽然能跑通,但极不合规;
参考了 属性重命名 @SerializedName 之后,改为如下(包含两个改动点,Bean中的属性需要加上注释,在对JosnStr进行解析的时候需要使用特定的解析方式)
JSON串(不变):
<pre class="cm-s-default" style="color: rgb(89, 89, 89); margin: 0px; padding: 0px; background: none 0% 0% / auto repeat scroll padding-box border-box rgba(0, 0, 0, 0);">{
"sofa调用结果": "id",
"更多trace信息": {
"测试一下": "test"
}
}</pre>
正例(简化下,getter 和 setter 就不写了):
<pre class="cm-s-default" style="color: rgb(89, 89, 89); margin: 0px; padding: 0px; background: none 0% 0% / auto repeat scroll padding-box border-box rgba(0, 0, 0, 0);">public class TestOut {
@SerializedName("sofa调用结果")
private String id;
@SerializedName("更多trace信息")
private TestOrTest moreInformation;
}</pre>
<pre class="cm-s-default" style="color: rgb(89, 89, 89); margin: 0px; padding: 0px; background: none 0% 0% / auto repeat scroll padding-box border-box rgba(0, 0, 0, 0);">public class TestOrTest {
@SerializedName("测试一下")
private String test;
}</pre>
测试:
<pre class="cm-s-default" style="color: rgb(89, 89, 89); margin: 0px; padding: 0px; background: none 0% 0% / auto repeat scroll padding-box border-box rgba(0, 0, 0, 0);">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());
}
}</pre>
结果:
image.pngThat's it.