当前位置: 首页 > 面试题库 >

将JSON数组解析为Java对象

孟子墨
2023-03-14
问题内容

我正在尝试使用Jacksonmapper进行解析以将大JSON解析为java对象。我有一个很大的JSON,但遇到了其中的这一小片段,不确定如何解析。
这是JSON,其格式看起来几乎没有什么不同。我试图了解如何将其解析为对象。

{
    "coordinates": [
        [
            [
                -72.943068,
                45.842298
            ],
            [
                -72.943075,
                45.841859
            ]
        ]
    ]
}

我不知道它采用哪种格式,以及如何将其解析为对象。


问题答案:

这取决于你的身材有多大JSON。如果可以将其加载到内存,则可以使用最简单的方法: 解决方案1:
POJO类:

class CoordinatesContainer {

    private double[][][] coordinates;

    public double[][][] getCoordinates() {
        return coordinates;
    }

    public void setCoordinates(double[][][] coordinates) {
        this.coordinates = coordinates;
    }

    @Override
    public String toString() {
        StringBuilder builder = new StringBuilder(1024);
        for (double[] arrayItem : coordinates[0]) {
            builder.append(Arrays.toString(arrayItem));
            builder.append(", ");
        }
        return builder.toString();
    }
}

用法:

ObjectMapper mapper = new ObjectMapper();
CoordinatesContainer coordinatesContainer = mapper.readValue(json, CoordinatesContainer.class);
System.out.println(coordinatesContainer);

上面的程序打印:

[-72.943068, 45.842298], [-72.943075, 45.841859]

解决方案2:
但是,如果您JSON的确很大,并且无法将其加载到内存中,则应考虑Jackson Streaming
API。在这种情况下,您不应创建POJO类并尝试按“节点”来处理每个元素“节点”:

import java.io.File;
import java.io.IOException;
import java.math.BigDecimal;
import java.util.Arrays;

import com.fasterxml.jackson.core.JsonFactory;
import com.fasterxml.jackson.core.JsonParser;
import com.fasterxml.jackson.core.JsonToken;

public class JsonProgram {

    public static void main(String[] args) throws IOException {
        File json = new File("/x/data.json");
        JsonFactory jsonFactory = new JsonFactory();
        JsonParser parser = jsonFactory.createParser(json);
        // Skip all elements to first array
        while (parser.nextToken() != JsonToken.START_ARRAY) {
        }
        parser.nextToken();
        // First level
        while (parser.nextToken() != JsonToken.END_ARRAY) {
            // Skip inner start array element
            parser.nextToken();
            System.out.println();
            System.out.println("NEXT ARRAY NODE");

            BigDecimal first = parser.getDecimalValue();

            // Go to second value
            parser.nextToken();

            BigDecimal second = parser.getDecimalValue();

            // Skip inner end array element
            parser.nextToken();

            // Handle array item
            System.out.println("First: " + first.toString());
            System.out.println("Second: " + second.toString());
        }
    }
}

上面的程序打印:

NEXT ARRAY NODE
First: -72.943068
Second: 45.842298

NEXT ARRAY NODE
First: -72.943075
Second: 45.841859

在我的示例中,我使用Jackson2.2.3版本。



 类似资料:
  • 你好,我有以下任务: 具有JSON对象的URL: *通过注释定义如何将JSON定义到Java列表中,并找到其中有“名称”的对象。 我认为问题是在不使用任何java库的情况下解析JSON。到目前为止,我已经开发了以下代码: 我在这里做的是我有一个JSONObject类,它将JSON属性存储在映射中,然后我想使用反射来填充任何类。 为了解析JSON,我尝试创建一个迷你FSM(:)),它使用For循环解

  • 问题内容: 我正在使用Weather Underground API制作应用程序,但在解析与严重警报有关的代码块时遇到了麻烦。JSON使用具有子键值对的键值对- 这对我来说不是问题,因为我可以从中选出后续的NSDictionary-但严重警报的条目被证明是有问题的。见下文: “警报”对与我已经解析的其他对有所不同,因为它在子值周围有这个 []括号 ,而且我不确定如何清除它,以便可以访问子值。在我能

  • 我正在尝试使用jQuery将此对象转换为数组 我试图得到这样的数组输出: 怎样?

  • 问题内容: 我试图从JSON数组中获取每个JSON对象。我通过HTTP发布获得此数据。 我知道我的数据是什么样的: 我的示例代码和结构如下所示: 我不确定如何遍历JSON数组并获取JSON对象,然后仅使用JSON对象。 问题答案: 试试这个作为您的结构, 您的名称不正确,顶层名称也不正确。解码为a之后,您可以遍历切片以获取每个切片

  • 这里是我被困的地方,我在哪里创建我的新Gson()来在发送数据之前解析它?

  • 问题内容: 我正在尝试在此链接中使用示例 http://sharpdevpt.blogspot.com/2009/10/deserialize-json- on-c.html?showComment=1265045828773#c2497312518008004159 但是我的项目无法使用JavaScriptConvert.DeserializeObject进行编译,该示例说这是来自.net库,有