gpt4 book ai didi

java - 如何从一个文件中读取大量 JSON-s

转载 作者:行者123 更新时间:2023-11-29 23:16:05 25 4
gpt4 key购买 nike

我不知道如何在 Android 中读取包含大量 JSON 的文件。我什至不知道 JSON 中有多少元素。这是 JSON 的一部分:

{
"distance" : 0.0,
"lat" : 52.297819,
"lon" : 20.937653,
"realTime" : 1553448972482,
"speed" : "NaN",
"time" : 0.0
}{
"pulse" : 77,
"rr" : [ 788 ],
"time" : 1553448976957
}{
"distance" : 0.0,
"lat" : 52.297819,
"lon" : 20.937653,
"realTime" : 1553448977481,
"speed" : "NaN",
"time" : 0.0
}

我创建了两个模型 DTO 类:

 public class GpsDTO{
double lat;
double lon;
double speed;
double distance;
double time;
long realTime;
}
public class HeartDTO{
long time;
int pulse;
int[] rr;
}

我尝试使用库 GSON 但它不起作用。

Gson gson = new GsonBuilder().setLenient().create();
try {
GpsDTO gpsDTO = gson.fromJson(new FileReader(path),GpsDTO.class);
} catch (Exception e) {
e.printStackTrace();
}

最佳答案

提供的 JSON 负载无效。默认情况下,Gson 不会读取无效的 JSON 有效载荷。我们需要为它实现自定义反序列化器。 JSON 结构在这种情况下是 JSON object-es 的列表。我们可以使用 JsonReader 和流 API。最快的方法是读一遍,但读两遍更容易:

  • 第一次阅读以找到类和适配器的顺序
  • 第二次读取以使用给定的 i - adapter 反序列化 i - JSON 对象

为了匹配下面的适配器,实现使用了 JSON 对象中的所有属性(findAdapters 方法)。如果它不是您的最佳算法,请实现其他符合要求的算法:

class MultiJsonReader {

// constant list of properties for each class
private final List<String> HEART_PROPS = Arrays.asList("pulse", "rr", "time");
private final List<String> GPS_PROPS = Arrays.asList("lat", "lon", "distance", "speed", "realTime", "time");

private final Gson gson;

public MultiJsonReader(Gson gson) {
this.gson = gson;
}

public List<Object> readAll(File jsonFile) throws IOException {
List<TypeAdapter<?>> adapters;
// read first time for finding types and adapters
try (JsonReader jsonReader = gson.newJsonReader(new FileReader(jsonFile))) {
jsonReader.setLenient(true);
adapters = findAdapters(gson, jsonReader);
}

List<Object> objects = new ArrayList<>();

// read second time for deserialising
try (JsonReader jsonReader = gson.newJsonReader(new FileReader(jsonFile))) {
jsonReader.setLenient(true);
for (TypeAdapter<?> adapter : adapters) {
objects.add(adapter.read(jsonReader));
}
}

return objects;
}

private List<TypeAdapter<?>> findAdapters(Gson gson, JsonReader jsonReader) throws IOException {
List<TypeAdapter<?>> adapters = new ArrayList<>();

while (jsonReader.peek() != JsonToken.END_DOCUMENT) {
List<String> names = new ArrayList<>();

jsonReader.beginObject();
while (jsonReader.peek() != JsonToken.END_OBJECT) {
names.add(jsonReader.nextName());
jsonReader.skipValue();
}
jsonReader.endObject();

Class<?> clazz = getClassForProperties(names);
adapters.add(gson.getAdapter(clazz));
}

return adapters;
}

private Class<?> getClassForProperties(List<String> properties) {
if (HEART_PROPS.containsAll(properties)) {
return HeartDTO.class;
}
if (GPS_PROPS.containsAll(properties)) {
return GpsDTO.class;
}

throw new IllegalArgumentException("Properties are not known " + properties);
}
}

示例用法:

import com.google.gson.Gson;
import com.google.gson.GsonBuilder;
import com.google.gson.TypeAdapter;
import com.google.gson.stream.JsonReader;
import com.google.gson.stream.JsonToken;

import java.io.File;
import java.io.FileReader;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;

public class GsonApp {

public static void main(String[] args) throws Exception {
File jsonFile = new File("./resource/test.json").getAbsoluteFile();

Gson gson = new GsonBuilder().create();
MultiJsonReader reader = new MultiJsonReader(gson);
List<Object> objects = reader.readAll(jsonFile);

objects.forEach(System.out::println);
}
}

对于您的 JSON 负载打印:

GpsDTO{lat=52.297819, lon=20.937653, speed=NaN, distance=0.0, time=0.0, realTime=1553448972482}
HeartDTO{time=1553448976957, pulse=77, rr=[788]}
GpsDTO{lat=52.297819, lon=20.937653, speed=NaN, distance=0.0, time=0.0, realTime=1553448977481}

关于java - 如何从一个文件中读取大量 JSON-s,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55327147/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com