如何反序列化非英文键的JSON,映射到属性为英文的Java类?
反序列化字段对应实现方案
字段映射关系梳理
首先明确JSON键和Java类属性的对应规则:
- JSON键
tunnus→ Java类id属性 - JSON键
nimi→ Java类name属性 - JSON键
sijainti→ Java类location属性 - JSON键
korkeus→ Java类height属性
另外注意:你的JSON结构外层包含count和results两个字段,其中results才是灯塔对象数组,需要先定义一个外层响应包装类再做反序列化。
方案1:使用Jackson库(Spring生态默认JSON库)
第一步:给Lighthouse类添加字段映射注解
import com.fasterxml.jackson.annotation.JsonProperty; public class Lighthouse { @JsonProperty("tunnus") private int id; @JsonProperty("nimi") private String name; @JsonProperty("sijainti") private String location; @JsonProperty("korkeus") private int height; // 原有构造方法、getter、setter保持不变 }
第二步:定义外层响应包装类
import java.util.List; public class LighthouseResponse { private int count; private List<Lighthouse> results; public int getCount() { return count; } public void setCount(int count) { this.count = count; } public List<Lighthouse> getResults() { return results; } public void setResults(List<Lighthouse> results) { this.results = results; } }
第三步:反序列化代码示例
import com.fasterxml.jackson.databind.ObjectMapper; import java.io.File; // 反序列化逻辑 ObjectMapper objectMapper = new ObjectMapper(); LighthouseResponse response = objectMapper.readValue(new File("lighthouses.json"), LighthouseResponse.class); List<Lighthouse> lighthouses = response.getResults();
Jackson默认支持自动将字符串格式的数字转为int类型,不需要额外处理korkeus的字符串格式问题。
方案2:使用Gson库
第一步:给Lighthouse类添加字段映射注解
import com.google.gson.annotations.SerializedName; public class Lighthouse { @SerializedName("tunnus") private int id; @SerializedName("nimi") private String name; @SerializedName("sijainti") private String location; @SerializedName("korkeus") private int height; // 原有构造方法、getter、setter保持不变 }
第二步:定义外层响应包装类(和Jackson方案一致,无需额外注解)
第三步:反序列化代码示例
import com.google.gson.Gson; import java.io.FileReader; import java.io.Reader; // 反序列化逻辑 Gson gson = new Gson(); try (Reader reader = new FileReader("lighthouses.json")) { LighthouseResponse response = gson.fromJson(reader, LighthouseResponse.class); List<Lighthouse> lighthouses = response.getResults(); }
注意事项
你提供的JSON示例中results数组最后一个元素末尾有多余的逗号,反序列化前请先删除该逗号,避免严格模式的解析器报错。
内容的提问来源于stack exchange,提问作者Timo Kälviäinen
相关产品推荐
相关产品推荐

