2017-02-05 2 views
0

Я успешно создал файл JSON с gson, но теперь, когда я хочу разобрать тот же файл, кодировка все испортится.Как декодировать JSON-файл, созданный с помощью GSON в Java?

Это код, который я использую для чтения файла в формате JSON:

BufferedReader jsonFile = new BufferedReader(new FileReader("file.json")); 
Map<String, List<long[]>> trafficInput = new HashMap<>(); 
trafficInput = gson.fromJson(jsonFile, HashMap.class); 

Я не могу показаться, чтобы выяснить, как обеспечить файл получает разобрали правильный путь.

Например, это правильный код JSON из файла:

{"paris":[[1485907200000,182184411,41274],[1485993600000,151646118,36697],"london":[[1485907200000,30200160,155827]} 

... получает разобранный, как это:

{"paris":[[1.4859072E12,1.82184411E8,41274.0],[1.4859936E12,1.51646118E8,36697.0],"london":[[1.4859072E12,3.020016E7,155827.0]} 

это ухудшит остальную часть кода, как тоскует Арен» t longs больше.

Например, если я пытаюсь напечатать значение, так как:

System.out.println(trafficInput.get("paris").get(0)[0]); 

... Я получаю эту ошибку:

Exception in thread "main" java.lang.ClassCastException: java.util.ArrayList cannot be cast to [J 

Любая помощь?

+0

Это может быть просто 'toString' реализация' List/long', вы пробовали перебирать через список, распечатывающее индивидуальное значение? –

+0

У меня есть и есть ошибка. В нем говорится, что List/longs нельзя повторять по длительности. Однако Strings тоже не работают. – TheBigDoubleA

+0

'System.out.println (trafficInput.get (" paris "). Get (0) [0]));' что это печатает? –

ответ

2

Это происходит из-за следующей строки:

trafficInput = gson.fromJson(jsonFile, HashMap.class); 

Эта строка инструктирует gson десериализовать строку в HashMap без указания типа и, следовательно, gson применяет механизм преобразования по умолчанию (то есть преобразование Number в double и т.д). Вот почему результат Sysout приводит к ClassCastException, потому что этот элемент не является array.

Все, что вам нужно сделать, это указать TypeToken при вызове метода fromJson, и он позаботится о типах. например:

Gson gson = new Gson(); 
Type type = new TypeToken<Map<String, List<long[]>>>(){}.getType(); 
Map<String, List<long[]>> trafficInput = new HashMap<>(); 
trafficInput = gson.fromJson("{\"paris\":[[1485907200000,182184411,41274],[1485993600000,151646118,36697]],\"london\":[[1485907200000,30200160,155827]]}", type); 
System.out.println(trafficInput); 
System.out.println(gson.toJson(trafficInput)); 

Вышеприведенный фрагмент печатает цифры без научных обозначений.

+0

отличный ответ, спасибо – TheBigDoubleA

Смежные вопросы