【问题标题】:GSON - Optional and required fields with naming policyGSON - 带有命名策略的可选和必填字段
【发布时间】:2017-02-03 10:08:01
【问题描述】:

我需要一个函数,它读取 json 文件并控制 json 文件的结构。应定义必填字段。为了那个原因 我发现一个问题可以解决我的部分问题Gson optional and required fields。但在这种情况下,命名约定不再有效。就我而言,我使用了以下 GsonBuilder:

 this.gsonUpperCamelCase = new GsonBuilder()
            .registerTypeAdapter(TestClass.class, new AnnotatedDeserializer<TestClass>())
            .setFieldNamingPolicy(FieldNamingPolicy.UPPER_CAMEL_CASE)
            .create();

来自 JSON 的每个键值对,在这种情况下,反序列化的 java 对象都需要小写。否则会抛出 JsonParseException。

例如我有这个类:

class TestClass {
  @JsonRequired
  private String testName;
  //getter & setter

那么这个 JSON 文件就不能反序列化了:

{
   "TestName":"name"
}

但我想确定在这种情况下使用了 UPPER_CAMEL_CASE。谢谢。

【问题讨论】:

  • MissBonbon,“控制结构”是什么意思?
  • 我想确保 JSON 文件中给出了“TestName”。

标签: java gson deserialization


【解决方案1】:

SerializedName 是可以帮助您解决此问题的注释。如下修改TestClass,您应该能够使用TestNametntn2 反序列化JSON,并且在序列化时,它始终使用testName

static class TestClass {
    @JsonRequired
    @SerializedName(value="testName", alternate = {"TestName", "tn", "tn2"})
    private String testName;
}



public static void main(String[] args) {
    Gson gsonUpperCamelCase = new GsonBuilder()
            .registerTypeAdapter(TestClass.class,
                    new AnnotatedDeserializer<TestClass>())
            .setFieldNamingPolicy(FieldNamingPolicy.UPPER_CAMEL_CASE)
            .create();

    TestClass tc = gsonUpperCamelCase.fromJson("{\r\n" + 
            "   \"TestName\":\"name\"\r\n" + 
            "}", TestClass.class);

    System.out.println(tc.testName);

    System.out.println(gsonUpperCamelCase.toJson(tc));
}

输出

name
{"testName":"name"}

【讨论】:

  • 这么简单?!?!我非常感谢! THX :)
猜你喜欢
  • 2014-03-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-06-04
  • 2015-02-11
  • 1970-01-01
  • 2020-06-06
相关资源
最近更新 更多