美文网首页
如果类的属性需要中文名怎么办

如果类的属性需要中文名怎么办

作者: 一只狗被牵着走 | 来源:发表于2019-07-29 11:51 被阅读0次

类中的属性是坚决不建议出现中文命名的(原因主要为,中文命名的属性在碰到乱码问题时,程序可能会崩掉)。

但是,如果上游传来的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.png

That's it.

相关文章

  • 如果类的属性需要中文名怎么办

    类中的属性是坚决不建议出现中文命名的(原因主要为,中文命名的属性在碰到乱码问题时,程序可能会崩掉)。 但是,如果上...

  • C#代码规范

    1.注释规范 类型、属性、委托、方法、方法参数,根据需要添加注释。如果类型、属性、委托、方法、方法参数的名称已经是...

  • Kotlin基础之定义类及构造方法

    Kotlin中定义类的关键字依然是class 如果类中还需要方法或者属性的话,就需要加上大括弧了 Kotlin中默...

  • iOS-利用Runtime完成归档与解档 <NSCodin

    如果类有多个属性的话,利用runtime就轻松多了! .h文件

  • 结果类-R的设计

    零、本文纲要 一、属性(字段)设计1、属性确定2、属性选择 二、方法设计1、方法确定2、方法选择 三、结果类R 一...

  • CSS文字相关属性

    注意: 字体中文名称需要加"" 简写:font:style,weight,size,family    如:fon...

  • Flutter-视图

    滑动视图(PageView) 主要属性 不知道起什么中文名的属性(pageSnapping) 反转(reserve...

  • 组合优于继承之__getattr__

    查找一个实例或类的属性失败时,会调用__getattr__方法查找相应的属性,如果类里面没有定义该方法的话,则会报...

  • 认识lombok 的@Builder注解对初始化的影响

    先上结论:如果类中用了@Builder注解,而属性没有任何注解话,那么在你初始化这个类的时候,如果你的属性赋值了默...

  • 认识lombok 的@Builder注解对初始化的影响

    先上结论:如果类中用了@Builder注解,而属性没有任何注解话,那么在你初始化这个类的时候,如果你的属性赋值了默...

网友评论

      本文标题:如果类的属性需要中文名怎么办

      本文链接:https://www.haomeiwen.com/subject/qubwlctx.html