我正在尝试从JSON数组arrivalTime
获取stops
的值,但我收到此错误
- 类型不匹配:无法从List转换为 图
- arrivalTime无法解析或不是字段
我该如何解决?
我感谢任何帮助。
简单:
[
{
"stops": [
{
"arrival_time": {
"sat": [ "04:41", "05:41","06:09"],
"mon-fri": ["04:24","05:10","05:40"],
"sun": ["07:20","08:20","09:20"]
},
"stop_name": "Ravensbusch "
}
],
"route": "2",
"direction": "Bornkamp"
}
]
根类:
public class Root {
public List<Stops> stops = new ArrayList<Stops>();
public String route;
private String direction;
public static class Stops {
public Map<String, String[]> arrivalTime = new HashMap<>();
public String stopsName;
}
}
注射类:
public class Injection {
public static void main(String[] args) throws Exception {
ObjectMapper mapper = new ObjectMapper();
InputStream is = Injection.class.getResourceAsStream("/jsonfile.txt");
List<Root> roots = mapper.readValue(is, TypeFactory.defaultInstance()
.constructCollectionType(List.class, Root.class));
Root root = roots.get(0);
System.out.println("route: " + root.route);
//here is the error.
Map<String, String[]> arrivalTimes = root.stops.arrivalTime;
for (Map.Entry<String, String[]> entry: arrivalTimes.entrySet()) {
System.out.println(entry.getKey());
for (String time: entry.getValue()) {
System.out.println(time);
}
}
}
}
答案 0 :(得分:2)
好像你缺少杰克逊的注释(特别是由于在Json和会员名称中,arrival_time和StopsName不同。这对我有用:
```
public class Stops {
public Map<String, String[]> arrivalTime = new HashMap<>();
public String stopsName;
@JsonCreator
public Stops(@JsonProperty("arrival_time") Map<String, String[]> arrivalTime,
@JsonProperty("stop_name") String stopsName) {
this.arrivalTime = arrivalTime;
this.stopsName = stopsName;
}
}
public class Root {
public List<Stops> stops = new ArrayList<Stops>();
public String route;
private String direction;
@JsonCreator
public Root(@JsonProperty("stops") List<Stops> stops,
@JsonProperty("route") String route,
@JsonProperty("direction") String direction) {
this.stops = stops;
this.route = route;
this.direction = direction;
}
}
public static void main(String[] args) throws Exception {
ObjectMapper mapper = new ObjectMapper();
String is = "[{\"stops\":[{\"arrival_time\":{\"sat\":[\"04:41\",\"05:41\",\"06:09\"],\"mon-fri\":[\"04:24\",\"05:10\",\"05:40\"],\"sun\":[\"07:20\",\"08:20\",\"09:20\"]},\"stop_name\":\"Ravensbusch \"}],\"route\":\"2\",\"direction\":\"Bornkamp\"}]";
List<Root> roots = mapper.readValue(is, TypeFactory.defaultInstance()
.constructCollectionType(List.class, Root.class));
// Rest of your code here
}
```
答案 1 :(得分:0)
如果您不想使用Json注释。请遵循以下我的发现。
public class Root {
public List<Stops> stops = new ArrayList<Stops>();
public String route;
public String direction; //Fix: Make it public
public static class Stops {
//Fix: Change attribute name to match input file arrival_time.
public Map<String, String[]> arrival_time = new HashMap<String, String[]>();
//Fix: Change attribute name to match input file stop_name.
public String stop_name;
}
}
public class Injection {
public static void main(String[] args) throws Exception {
ObjectMapper mapper = new ObjectMapper();
//InputStream is = Injection.class.getResourceAsStream("./jsonfile.txt");
//List<Root> roots = mapper.readValue(is, TypeFactory.defaultInstance().constructCollectionType(List.class, Root.class));
//Fix: Read from file without input stream.
List<Root> roots = mapper.readValue(new File("./jsonfile.txt"), TypeFactory.defaultInstance().constructCollectionType(List.class, Root.class));
Root root = roots.get(0);
System.out.println("route: " + root.route);
//Fix: Read the first Item of the stops list or iterates it.
Map<String, String[]> arrivalTimes = root.stops.get(0).arrival_time;
for (Map.Entry<String, String[]> entry: arrivalTimes.entrySet()) {
System.out.println(entry.getKey());
for (String time: entry.getValue()) {
System.out.println(time);
}
}
}
}