我在json提交数据时遇到问题。总共有很多类似的问题,但没有一个对我有帮助.Me json看这个
{
"miasta" : ["A", "B", "C", "D", "E"],
"drogi" : [
{
"miasta" : ["A", "B"],
"czas_przejazdu" : 2
},
{
"miasta" : ["A", "C"],
"czas_przejazdu" : 3
},
{
"miasta" : ["A", "D"],
"czas_przejazdu" : 4
},
{
"miasta" : ["A", "E"],
"czas_przejazdu" : 1
}
],
"timeout" : 5,
"max_czas_przejazdu" : 10
}
我尝试了不同的方法,但我没有得到所有的数据。这是我目前的代码:
public static void main(String[] args) throws FileNotFoundException, ParseException, IOException {
JSONParser parser = new JSONParser();
JSONArray a = (JSONArray) parser.parse(new FileReader("C:\\Users\\Laptop\\Desktop\\in.json"));
for (Object o : a)
{
JSONObject person = (JSONObject) o;
String name = (String) person.get("miasta");
System.out.println(name);
JSONArray drogi = (JSONArray) person.get("drogi");
for (Object c : drogi)
{
System.out.println(c+"");
}
String job = (String) person.get("czas_przejazdu");
System.out.println(job);
}
}
错误:
线程中的异常" main" java.lang.ClassCastException: org.json.simple.JSONObject无法强制转换为org.json.simple.JSONArray 在zadanie。
答案 0 :(得分:0)
JSON对象以花括号开头和结尾,即......
{“name”:“joe”,“age”:“29”}
JSON数组以方括号开头和结尾,即......
[“bill”,29]
您发布的JSON是一个JSON对象,因为它以花括号开头和结尾,但它包含JSON数组。因此,在迭代数据时,您需要在适当的位置强制转换数组。
首先,将您的JSONArray声明更改为
JSONObject a =(JSONObject)parser.parse(new FileReader(“C:\ Users \ Laptop \ Desktop \ in.json”));
<强>更新强>
这应该适合你。
JSONParser parser = new JSONParser();
try (BufferedReader br = new BufferedReader(new FileReader(System.getProperty("user.home") + File.separator + "in.json"))) {
StringBuilder jsonBuilder = new StringBuilder();
String line;
while ( (line = br.readLine()) != null) {
jsonBuilder.append(line);
}
JSONObject fullJsonObject = (JSONObject) parser.parse(jsonBuilder.toString());
//System.out.println(fullJsonObject);
JSONArray mista = (JSONArray) fullJsonObject.get("miasta");
//System.out.println(mista);
JSONArray drogi = (JSONArray) fullJsonObject.get("drogi");
//System.out.println(drogi);
List<JSONObject> drogi_objects = new ArrayList<>();
Iterator<JSONObject> itr = drogi.iterator();
while (itr.hasNext()) {
drogi_objects.add( itr.next() );
}
//System.out.println(drogi_objects);
int iteration = 1;
for(JSONObject element : drogi_objects) {
System.out.println("\n");
System.out.println("Iteration:\t " + iteration);
System.out.println("Miasta\t: " + element.get("miasta"));
System.out.println("czas_przejazdu:\t" + element.get("czas_przejazdu"));
++iteration;
}
} catch (Exception ex) {
ex.printStackTrace();
}
答案 1 :(得分:0)
我可以给你一个主意吗?假设您正在使用Jackson(我非常同意)为什么不创建一个与您的json匹配的Java类,并使用ObjectMapper来映射它以便您可以更轻松地使用该类?
与你的json对象匹配的java类是这样的(注释只是lombok库,以避免样板getter和setter代码,但它不是强制性的)
@Getter
@Setter
@AllArgsConstructor
@NoArgsConstructor
public class CustomClass {
List<String> miasta;
List<Drogi> drogi;
Integer timeout;
Integer max_czas_przejazdu;
}
使用该类,您只需要使用ObjectMapper。这里显示的测试与您发布的JSON相匹配
public class UseOfObjectMapperTest{
@Test
public void testSerializer() throws Exception{
//Read example
ObjectMapper objectMapper = new ObjectMapper();
CustomClass customClass = objectMapper.readValue(new File("src/test/resources/customclass.json"),CustomClass.class);
System.out.println(objectMapper.writeValueAsString(customClass));
//Write Example
CustomClass cc = new CustomClass(
Arrays.asList("A","B"),
Arrays.asList(new Drogi(Arrays.asList("C1","D1"), 10),
new Drogi(Arrays.asList("C2","D2"),10)),
15,20);
System.out.println(objectMapper.writeValueAsString(cc));
}
}