Java 将JSON键解析为字段值

Java 将JSON键解析为字段值,java,json,gson,Java,Json,Gson,我有一个translation JSON对象,它将区域设置映射到消息,并采用以下形式: {"en_US" : "English Text", "sp": "Spanish Text", "fr" : "French Text", ... } 有没有办法使用gson将JSON对象映射为以下类的列表 class Translation { String locale, text; } 我知道我可以先将其解析为一个映射,然后遍历映射元素来创建翻译对象,但我不确定是否有“gson”方法可以做到

我有一个translation JSON对象,它将区域设置映射到消息,并采用以下形式:

{"en_US" : "English Text", "sp": "Spanish Text", "fr" : "French Text", ... }
有没有办法使用gson将JSON对象映射为以下类的列表

class Translation {
   String locale, text;
}

我知道我可以先将其解析为一个映射,然后遍历映射元素来创建翻译对象,但我不确定是否有“gson”方法可以做到这一点。

有两种选择。如果需要序列化和反序列化数据,可以编写自定义的
TypeAdapter

class TranslationTypeAdapter extends TypeAdapter<List<Translation>> {
    @Override
    public void write(JsonWriter out, List<Translation> list) throws IOException {
        out.beginObject();
        for(Translation t : list) {
            out.name(t.locale).value(t.text);
        }
        out.endObject();
    }

    @Override
    public List<Translation> read(JsonReader in) throws IOException {
        List<Translation> list = new ArrayList<>();
        in.beginObject();
        while(in.hasNext()) {
            list.add(new Translation(in.nextName(), in.nextString()));
        }
        in.endObject();
        return list;
    }
}

但是,如果只需要反序列化数据,则可以编写自定义反序列化程序:

class TranslationDeserializer implements JsonDeserializer<List<Translation>> {
    @Override
    public List<Translation> deserialize(JsonElement json, Type typeOfT, JsonDeserializationContext context) throws JsonParseException {
        List<Translation> list = new ArrayList<>();
        for(Map.Entry<String, JsonElement> entry : json.getAsJsonObject().entrySet()) {
            list.add(new Translation(entry.getKey(), entry.getValue().getAsString()));
        }
        return list;
    }
}
类TranslationDeserializer实现JsonDeserializer{
@凌驾
公共列表反序列化(JsonElement json,类型typeOfT,JsonDeserializationContext)引发JsonParseException{
列表=新的ArrayList();
for(Map.Entry:json.getAsJsonObject().entrySet()){
添加(新的翻译(entry.getKey(),entry.getValue().getAsString());
}
退货清单;
}
}

如第一个示例所示,您可以使用
GsonBuilder
注册此反序列化程序。这当然会产生相同的输出。

@Konrad我正在寻找列表对象的序列化器/反序列化器
[Translation{locale='en_US', text='English Text'}, Translation{locale='sp', text='Spanish Text'}, Translation{locale='fr', text='French Text'}]
class TranslationDeserializer implements JsonDeserializer<List<Translation>> {
    @Override
    public List<Translation> deserialize(JsonElement json, Type typeOfT, JsonDeserializationContext context) throws JsonParseException {
        List<Translation> list = new ArrayList<>();
        for(Map.Entry<String, JsonElement> entry : json.getAsJsonObject().entrySet()) {
            list.add(new Translation(entry.getKey(), entry.getValue().getAsString()));
        }
        return list;
    }
}