Java中使用Gson将JSON文件所有元素解析为数组的技术问询
解决Gson解析动态键JSON为对象数组的问题
嘿,我懂你这种卡壳的感觉——这种顶层键名不固定(spawn1、spawn2还会不停新增)的JSON结构,用常规的固定POJO映射确实容易摸不着头脑。我来一步步教你用Gson把所有x、y、z值提取出来存成对象数组:
第一步:定义存储坐标的实体类
首先我们需要一个简单的类来存放每个spawn点的x、y、z值,Gson会自动把JSON里的对应字段映射到这个类的属性上:
public class SpawnPoint { private double x; private double y; private double z; // 必须要有无参构造器,Gson反射实例化对象时需要它 public SpawnPoint() {} // 可选:带参构造器方便手动创建对象 public SpawnPoint(double x, double y, double z) { this.x = x; this.y = y; this.z = z; } // 生成getter和setter方法(或者用Lombok的@Data注解一键生成) public double getX() { return x; } public void setX(double x) { this.x = x; } public double getY() { return y; } public void setY(double y) { this.y = y; } public double getZ() { return z; } public void setZ(double z) { this.z = z; } }
第二步:核心解析逻辑
因为你的JSON顶层是一个键值对集合(键是spawn1、spawn2这类动态名称,值是坐标对象),所以我们可以先把整个JSON解析成Map<String, SpawnPoint>,然后直接取Map里的所有值转成数组或者List就行,不管后续新增多少个spawnN都能自动处理:
import com.google.gson.Gson; import com.google.gson.reflect.TypeToken; import java.io.FileReader; import java.lang.reflect.Type; import java.util.Map; import java.util.List; import java.util.ArrayList; public class SpawnParser { public static void main(String[] args) { // 初始化Gson实例 Gson gson = new Gson(); // 用TypeToken解决Java泛型擦除的问题,告诉Gson我们要解析成Map<String, SpawnPoint>类型 Type spawnMapType = new TypeToken<Map<String, SpawnPoint>>() {}.getType(); try (FileReader reader = new FileReader("你的JSON文件路径.json")) { // 把JSON文件内容解析成Map Map<String, SpawnPoint> spawnMap = gson.fromJson(reader, spawnMapType); // 把Map中的所有SpawnPoint对象转成List List<SpawnPoint> spawnList = new ArrayList<>(spawnMap.values()); // 如果需要数组的话,直接转就行: SpawnPoint[] spawnArray = spawnMap.values().toArray(new SpawnPoint[0]); // 测试输出验证结果 for (SpawnPoint point : spawnList) { System.out.printf("坐标:x=%.2f, y=%.2f, z=%.2f%n", point.getX(), point.getY(), point.getZ()); } } catch (Exception e) { e.printStackTrace(); } } }
关键细节说明
- TypeToken的作用:Java的泛型会在编译时被擦除,所以直接用
Map.class的话,Gson不知道Map里的value是SpawnPoint类型,会把它们解析成默认的LinkedTreeMap,而不是我们需要的SpawnPoint对象。TypeToken就是用来保留泛型信息的。 - 动态键的处理:不管后续新增多少个spawn3、spawn4...,Map都会自动把这些键值对装进去,我们只需要取
values()就能拿到所有坐标对象,完全不用修改解析逻辑。
额外小提示
如果你的JSON内容不是来自文件,而是字符串,直接把字符串传给gson.fromJson()即可,比如:
String jsonStr = "{\"spawn1\":{\"x\":336.4962312645427, \"y\":81.0, \"z\":-259.029426052796}, \"spawn2\":{\"x\":341.11558917719424, \"y\":80.0, \"z\":-246.07415114625}}"; Map<String, SpawnPoint> spawnMap = gson.fromJson(jsonStr, spawnMapType);
这样就能轻松把所有坐标提取出来存成数组啦!
内容的提问来源于stack exchange,提问作者Norbox
相关产品推荐
相关产品推荐

