gpt4 book ai didi

java - 将 JSON 键解析为字段值

转载 作者:行者123 更新时间:2023-11-30 08:19:21 25 4
gpt4 key购买 nike

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

{"en_US" : "English Text", "sp": "Spanish Text", "fr" : "French Text", ... }

有没有办法让我使用 gson 将 JSON 对象映射为以下类的列表?

class Translation {
String locale, text;
}

我知道我可以首先将其解析为 map ,然后遍历 map 元素来创建翻译对象,但我不确定是否有“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;
}
}

然后:

TypeToken typeToken = new TypeToken<List<Translation>>(){};
Type type = typeToken.getType();
Gson gson = new GsonBuilder().registerTypeAdapter(type, new TranslationTypeAdapter()).create();
List<Translation> list = gson.fromJson(new FileReader(new File("json")),type);

输出:

[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;
}
}

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

关于java - 将 JSON 键解析为字段值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29170764/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com