【问题标题】:Parse every element of JSON to Array in Java将 JSON 的每个元素解析为 Java 中的数组
【发布时间】:2018-03-21 12:12:12
【问题描述】:

JAVA

我想将 JSON 文件的每个元素(最好使用 gson)解析为 Array。我搜索了两天,我仍然无法弄清楚如何正确地做到这一点。我的 JSON 文件如下所示:

{
  "spawn1": {
    "x": 336.4962312645427,
    "y": 81.0,
    "z": -259.029426052796
  },
  "spawn2": {
    "x": 341.11558917719424,
    "y": 80.0,
    "z": -246.07415114625
  }
}

会有越来越多不同名字的元素。我需要的是获取所有元素,如 x、y、z 并使用它创建一个对象并将其放置到数组中。该对象的类如下所示:

public class Chest {
  private double x, y, z;

  public Chest(double x, double y, double z) {
    this.x = x;
    this.y = y;
    this.z = z;
  }
}

【问题讨论】:

  • 如果您指定您使用的编程语言会更好?是 C# 吗?
  • 天啊!我很抱歉。刚刚编辑 - 它是 Java :)
  • 您的数据是一个带有键“spawn1”和“spawn2”的 JSON 对象。你希望它如何转换?忽略键的 Chest 对象数组?
  • 嗯。是的,我的对象中不需要这些名称。我将使用的唯一东西是坐标。
  • 你知道GSON,但没有尝试实现这个,为什么?

标签: java arrays json parsing


【解决方案1】:

使用 GSON

使用您拥有的 JSON 有点棘手,因为您说 Object 的数量可以改变,但它们不在数组中。但是您可以使用 JsonObject.entrySet 使用 GSON 迭代每个元素

首先,解析JSON并获取对象:

JsonObject json = JsonParser.parse(jsonToParse).getAsJsonObject();

然后你迭代元素:

List<Chest> list = new ArrayList<>();
for(Entry<String, JsonElement> e : json.entrySet()){
    //read the json you can find in `e.getValue()`
    JsonObject o = e.getValue().getAsJsonObject();
    double x = o.getAsJsonPrimitive("x").getAsDouble();
    ...

    //create the instance `Chest` with those `double` and insert into a `List<Chest>`
    list.add(new Chest(x,y,z));
}

如果你想检索到的名字,它在入口键中:e.getKey()

请注意,这可以使用 Stream 进行改进,但要保持家庭友好;)我会保持这个循环。

【讨论】:

  • 谢谢,我明天去看看
【解决方案2】:

对于您当前使用的课程,它不起作用。

您的 JSON 字符串当前需要 2 个如下所示的类:

public class ClassOne
{
    ClassTwo spawn1;
    ClassTwo spawn2;
}

public class ClassTwo
{
    double x;
    double y;
    double z;
}

因此,您需要更改 JSON 或类结构。


编辑

如果你想要你当前使用的类,你需要一个这种形式的 JSON 字符串:

[
  {
    "x": 1.0,
    "y": 2.0,
    "z": 3.0
  },
  {
    "x": 4.0,
    "y": 5.0,
    "z": 6.0
  }
]

如果您想维护您的 spawn1spawn2 字段,请在您的类中添加一个 String 字段并使用这样的 JSON 字符串(这里该字段的名称为 name):

[
  {
    "name": "spawn1",
    "x": 1.0,
    "y": 2.0,
    "z": 3.0
  },
  {
    "name": "spawn2",
    "x": 4.0,
    "y": 5.0,
    "z": 6.0
  }
]

当您从 JSON 转换它们时,它们都会返回 Chest[]

【讨论】:

  • "我需要获取所有元素,如 x、y、z 并使用它创建一个对象并将其放置到数组中"
  • @AxelH 我完全明白这是他想要的,但这不是他的 JSON 对应的。从他拥有的 JSON 字符串中,如果没有自定义加载器,他将永远无法获得。所以“要么改变你的 JSON 要么改变你的类结构”。
  • 但正如我所说,将会有更多的对象,例如 spawn1 和 spawn2,因此我认为为每个对象创建类并不是一个好主意。是否不可能遍历每个对象,例如“spawn1”,“spawn2”,为每个对象创建对象并将其放入 Chest 对象数组中?
  • @Norbox 我已经更新了我的答案,让你在正确的方向上大大点头。通常,如果您的 JSON 字符串没有反序列化为您的对象,请尝试另一种方式:将您的一个对象序列化为 JSON,以查看 String 的外观。
猜你喜欢
  • 1970-01-01
  • 2018-05-04
  • 1970-01-01
  • 1970-01-01
  • 2015-10-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多