【问题标题】:GSON read into array class elementGSON 读入数组类元素
【发布时间】:2023-04-10 07:47:02
【问题描述】:

我想将topojson 对象读入Java 类。 Topojson 是 JSON 的一个特殊类,在查找表中对象有弧的地方定义如下:

{
  "type":"Topology",
  "objects":{
    "collection":{
      "type":"GeometryCollection",
      "geometries":[
        {"type":"LineString","properties":{"id":842296681,"start":892624561,"end":892624564,"class":5,"lanes":null,"direction":"B","length":0.000485},"arcs":[0]},
        {"type":"LineString","properties":{"id":842296682,"start":892624563,"end":892624564,"class":5,"lanes":null,"direction":"B","length":0.000351},"arcs":[1]},
      ]
    }
  },
  "arcs":[
    [[4816,1007],[262,2281],[183,738]],
    [[4397,3892],[341,-268],[235,0],[288,402]]
  ],
  "transform":{
    "scale":[3.8203658765624953e-7,1.4901510251040002e-7],
    "translate":[-87.63437999816,41.86725999012999]},
    "bbox":[-87.63437999816,41.86725999012999,-87.63056001432003,41.86874999213999]
}

我正在尝试按照in this answer 的建议做,并将对象直接读入一个类,我有点尴尬地定义为

import java.util.ArrayList;
import java.util.Map;

/**
 * Created by gregmacfarlane on 7/11/17.
 */
public class TopoJsonNetwork {
  String type;
  Map<String, GeometryCollection> objects;
  ArrayList<Double[][]> arcs;
  Transform transform;

}

class GeometryCollection{
  String type;
  Geometry[] geometries;

}

class Geometry{

  String type;
  Map<String, String> properties;
  Integer[] arcs; // lines will have only a single arc


}


class Transform{
  Double[] scale;
  Double[] translate;
  Double[] bbox;

}

当我调用 gson 阅读器时,一切都很好

reader = new JsonReader(new FileReader(topoFile));

Gson gson = new Gson();
TopoJsonNetwork topoNet = gson.fromJson(reader, TopoJsonNetwork.class);

意味着我类的所有对象都已填充 --- 除了 arcs 数组。该元素在那里,但具有null 值。我应该如何更改此元素的定义方式以使其正确填充?

【问题讨论】:

    标签: java gson topojson


    【解决方案1】:

    使用您的代码,我可以获得预期的结果。我修改了您的主程序并使用嵌套的 for 循环将 ArrayList 作为二维数组循环。结果是您班级中arcs 列表中所有数字的列表。

    JsonReader reader = new JsonReader(new FileReader("topojson.json"));
    Gson gson = new Gson();
    TopoJsonNetwork topoNet = gson.fromJson(reader, TopoJsonNetwork.class);
    
    for (Double[][] d : topoNet.arcs) {
        for (int i = 0; i < d.length; i++) {
            for (int j = 0; j < d[i].length; j++) {
                System.out.println(d[i][j]);
            }
        }
    }
    

    在这种情况下,topoNet.arcs 是一个大小为 2 的列表,并且正如您所料,它包含几个二维 Double 数组。

    【讨论】:

    • 嗯。在我的完整程序和这个 MWE 中,我在 d : topoNet.arcs 通话中得到了 java.lang.NullPointerException。会不会是 Java 版本的东西?
    • 我使用的是 Java 8 和 Gson 2.6.2。这是下载该项目的直接链接,因为它当前在我的工作区中运行。您应该能够简单地导入它并查看它的运行情况:drive.google.com/file/d/0B_iQPwucAbKASEowWkx3TTBUN00/…。单击右上角的下载图标以获取 ZIP 文件。
    • 哈。原来我是从一个调试 json 中读取的,在那里我取出了 arcs 元素。 掌心