Как разобрать файл JSON? - PullRequest
       6

Как разобрать файл JSON?

9 голосов
/ 08 июня 2010

Простая ситуация -

  1. читать файл json
  2. обнаружение всех пар ключ-значение
  3. сравнить пары ключ-значение

Я попробовал gson, пакет с json.org, но, похоже, не смог далеко уйти.

Может ли кто-нибудь предоставить ясный пример на Java о том, как взять файл, прочитать его, в конечном итоге получить json objec, из которого я могу получить пары ключ / значение.

Учтите это:

private void runThroughJson(JsonObject jsonObject) {
    for (final Entry<String, JsonElement> entry : jsonObject.entrySet()) {

        final String key = entry.getKey();
        final JsonElement value = entry.getValue();

        System.out.println(key + " - " + value);

        if (value.isJsonObject()) {
            runThroughJson(value.getAsJsonObject());
        } else {                
            int ix = value.getAsString().indexOf('[');
            int ig = value.getAsString().lastIndexOf(']');

            System.out.println(ix);
            System.out.println(ig);

            String a = value.getAsString().substring(ix, ig);
            JsonElement jsonElement = parser.parse(a);
            runThroughJson(jsonElement.getAsJsonObject());
        }
    }
}

Логично, что все в порядке, однако я получаю исключение:

Exception in thread "main" java.lang.IllegalStateException
    at com.google.gson.JsonArray.getAsString(JsonArray.java:133)
    at com.cme.esg.bk.TryGson.runThroughJson(TryGson.java:46)
    at com.cme.esg.bk.TryGson.runThroughJson(TryGson.java:44)
    at com.cme.esg.bk.TryGson.goForIt(TryGson.java:32)
    at com.cme.esg.bk.TryGson.main(TryGson.java:16)

Можете ли вы сообщить, что я скучаю.

Ответы [ 3 ]

11 голосов
/ 09 июня 2010

С Gson (при условии, что у вас есть объект {...} на верхнем уровне вашего файла JSON):

final JsonParser parser = new JsonParser();
final JsonElement jsonElement = parser.parse(new FileReader("/path/to/myfile"));
final JsonObject jsonObject = jsonElement.getAsJsonObject();

for (final Entry<String, JsonElement> entry : jsonObject.entrySet()) {
   final String key = entry.getKey();
   final JsonElement value = entry.getValue();
   ....
}

В ответ на ваш комментарий:

Выбезусловно, следует избегать повторного разбора JSON из строки.Используйте что-то вроде:

... else if (value.isJsonArray()) {
   final JsonArray jsonArray = value.getAsJsonArray();
   if (jsonArray.size() == 1) {
      runThroughJson(jsonArray.get(0));
   } else {
        // perform some error handling, since
        // you expect it to have just one child!
   }

} 
1 голос
/ 13 января 2012

Мы используем анализатор Jaskson, вот пример кода:

protected T getJsonObject(InputStream inputStream, Class<T> className) throws JsonParseException,
      JsonMappingException, IOException {
    // Deserialize input to Json object
    ObjectMapper mapper = new ObjectMapper();

    T jsonSource = mapper.readValue(inputStream, className);
    return jsonSource;
}

Вот код, как его вызвать:

JsonEmployee jsonEmployee = getJsonObject(inputStream, JsonEmployee.class);

JsonEmployee.java это просто POJO

0 голосов
/ 09 июня 2010

XStream хорош для JSON: http://x -stream.github.io / json-tutorial.html

Благодаря гибкой архитектуре XStream, обработка отображений JSON так же проста, как и обработка документов XML. Все, что вам нужно сделать, это инициализировать объект XStream с помощью соответствующего драйвера, и вы готовы сериализовать свои объекты в (и из) JSON.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...