如何在GSON中获取json数据中的附加字段

xsuvu9jc  于 2022-11-06  发布在  其他
关注(0)|答案(2)|浏览(352)

我有一个JSON对象,它实际上是一个序列化的java对象。

{
  user: 'user',
  telephone: '123456789'
}

java对象的telephone字段已从“telephone”重命名为“mobile”。因此,现在java对象具有以下字段。

  • 使用者
  • 移动的

我想做的是一个数据迁移。我想从数据库中获得数据作为JSON字符串-〉并使用GSON将JSON解析为java对象(到目前为止我们使用的是gson.fromJson(class,data)方法)保留telephone中的值(因为telephone现在不是java类中的一个字段)-这样我就可以将数据传递给新字段(移动的)。
我该怎么做?
P.S.:-这不能通过一些简单的数据库查询来实现,因为我们使用的文件存储系统没有查询工具和编码值。
P.S.:-此外,我们使用实体事件框架

5q4ezhmt

5q4ezhmt1#

您需要编写自定义反序列化程序并将telephoneMap到mobile

import com.google.gson.Gson;
import com.google.gson.GsonBuilder;
import com.google.gson.JsonDeserializationContext;
import com.google.gson.JsonDeserializer;
import com.google.gson.JsonElement;
import com.google.gson.JsonObject;
import com.google.gson.JsonParseException;
import com.google.gson.annotations.JsonAdapter;

import java.io.File;
import java.io.FileReader;
import java.lang.reflect.Type;

public class GsonApp {

    public static void main(String[] args) throws Exception {
        File jsonFile = new File("./resource/test.json").getAbsoluteFile();

        Gson gson = new GsonBuilder()
                .create();

        try (FileReader jsonReader = new FileReader(jsonFile)) {
            System.out.println(gson.fromJson(jsonReader, User.class));
        }
    }
}

class UserJsonDeserializer implements JsonDeserializer<User> {

    @Override
    public User deserialize(JsonElement json, Type typeOfT, JsonDeserializationContext context) throws JsonParseException {
        JsonObject jsonObject = json.getAsJsonObject();

        User user = new User();
        user.setUser(jsonObject.get("user").getAsString());
        user.setMobile(jsonObject.get("telephone").getAsString());

        return user;
    }
}

@JsonAdapter(UserJsonDeserializer.class)
class User {

    private String user;
    private String mobile;

    // getters, setters, toString
}

印刷品:

User{user='user', mobile='123456789'}
hm2xizp9

hm2xizp92#

如果另一个google漫游者发现这个问题,有一种方法可以处理额外的标签,而不需要完全重新创建反序列化。基于这里给出的一个例子。基本前提是这个工厂首先去反序列化类,它使用类的下一个可能的类型适配器来处理初始反序列化,做它的后处理并返回结果。

class UserTypeAdapterFactory implements TypeAdapterFactory {
    public <T> TypeAdapter<T> create(Gson gson, TypeToken<T> type) {
        if (!User.class.isAssignableFrom(type.getRawType())) return null; // this class only serializes 'User' and its subtypes
        final TypeAdapter<User> userAdapter = gson.getDelegateAdapter(this, TypeToken.get(User.class)); // next adapter that isn't this one
        final TypeAdapter<JsonElement> elementAdapter = gson.getAdapter(JsonElement.class);
        TypeAdapter<User> result = new TypeAdapter<User>() {
            public void write(JsonWriter out, User value) throws IOException {
                userAdapter.write(out, value);
            }
            public User read(JsonReader in) throws IOException {
                JsonObject object = elementAdapter.read(in).getAsJsonObject();
                User profile = userAdapter.fromJsonTree(object);
                // apply old field to the new, if found (or whatever other post processing)
                try { profile.mobile = object.get("telephone").getAsString(); }
                catch (Exception ignored) {}
                return profile;
            }
        }.nullSafe();
        return (TypeAdapter<T>) result;
    }
}

然后向Gson对象中添加如下内容,并正常使用

private Gson createGson() {
    GsonBuilder gsonBuilder = new GsonBuilder();
    gsonBuilder.registerTypeAdapterFactory(new UserTypeAdapterFactory());
    return gsonBuilder.create();
}

注意本例中的JsonReader/JsonWriter都是来自gson库,可能还有其他实现,所以要注意导入。

import com.google.gson.Gson;
import com.google.gson.GsonBuilder;
import com.google.gson.JsonElement;
import com.google.gson.JsonObject;
import com.google.gson.TypeAdapter;
import com.google.gson.TypeAdapterFactory;
import com.google.gson.reflect.TypeToken;
import com.google.gson.stream.JsonReader;
import com.google.gson.stream.JsonWriter;

相关问题