当前位置: 首页 > 知识库问答 >
问题:

Gson将一个字段转换为多个字段

谢清野
2023-03-14

假设我已将以下对象序列化为json字符串:

class Person {
    public final String name;
    public Person(String name) { this.name = name; }
}

Person p = new Person("Bob Falaway");
JsonObject json = gson.toJsonTree(p, Person.class).getAsJsonObject();

现在我想反序列化它,但是我想把名称分成两个字段,firstNamelastName。我该怎么做呢?

我希望最终的结果是类似于:

class RefinedPerson {
    public final String firstName;
    public final String lastName;

    public String toString() { return String.format("%s %s", firstName, lastName); }
}

这对Gson有可能吗?

共有1个答案

步兴德
2023-03-14

为类型注册您自己的JsonSerializer(或者TypeAdapter,如果您愿意的话)?

类似的东西:

@JsonAdapter(PersonSerializer.class)
class Person {
    private final String name;
    Person(final String name) {
        // Some validation...
        this.name = name;
    }

    String getName() {
        return this.name;
    }
}

您的serialiser看起来像:

class PersonSerializer implements JsonSerializer<Person> {
    @Override
    public JsonObject serialise(final Person src,
                                final Type personType,
                                final JsonSerializationContext context) {

        final JsonObject json = new JsonObject();
        final String[] names = src.getName().split(" ");
        // Some validation...

        json.addProperty("firstName", names[0]);
        json.addProperty("lastName", names[1]);
        return json;
    }
}
 类似资料:
  • 假设我有一个Java类... 我想将这个单独的类与两个不同的服务一起使用。然而,这两种服务在返回数据的方式上有所不同。 ...还有...

  • 问题内容: 我已经看到了一些类似于我的问题的答案,但我无法使它们起作用。我的查询中有几个日期字段,它们返回日期和时间,例如2014年7月1日12:00:00 AM。有什么办法可以让字段显示2014年7月1日? 我基本上想将两个日期字段缩减为较短的日期格式减去时间。 提前致谢! 问题答案: 使用to_char函数:

  • 问题内容: 我有三个表,, 与下面的数据 页 标签 页面标签 我想在一个查询中获得一个包含SQL每一页的对应标签名的字符串。这是我想要的输出。 SQL可能吗? 我正在使用MySQL。尽管如此,如果可能的话,我希望有一个独立于数据库供应商的解决方案。 问题答案: 塞尔吉奥·德尔阿莫(Sergio del Amo): 但是,我没有没有标签的页面。我想我需要用左外部联接编写查询。 不是一个非常漂亮的查询

  • 我把这三门课分别放在不同的文件中 我有下面的映射器 这目前仅映射lastName并起作用,我想将Book中的作者字符串映射为 我怎么能这么做?我在MapStruct文档中找不到任何东西。

  • 此字段必须在mongo数据库中,由等差日期表示。 我可以为整个Pojo编写一个转换器,但因为它只是25个字段中的一个,所以没有太大意义,而且当一个字段发生变化或添加更多字段时,它是错误的另一个位置。 是否有一种方法调用默认的转换器服务,并在默认的转换服务之后更改其他2个服务,这将对性能产生很大影响。还是有一个默认的转换器接口要覆盖? 是的,我也可以写一个LongToDate转换器,但这将影响所有的

  • “想要解决方案B” 有什么办法可以做到这一点吗?