You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.20 11:40:59