Как разобрать JSON в Java - PullRequest
933 голосов
/ 07 апреля 2010

У меня есть следующий текст JSON. Как я могу разобрать это, чтобы получить значения pageName, pagePic, post_id и т. Д .?

{
   "pageInfo": {
         "pageName": "abc",
         "pagePic": "http://example.com/content.jpg"
    },
    "posts": [
         {
              "post_id": "123456789012_123456789012",
              "actor_id": "1234567890",
              "picOfPersonWhoPosted": "http://example.com/photo.jpg",
              "nameOfPersonWhoPosted": "Jane Doe",
              "message": "Sounds cool. Can't wait to see it!",
              "likesCount": "2",
              "comments": [],
              "timeOfPost": "1234567890"
         }
    ]
}

Ответы [ 31 ]

4 голосов
/ 28 июля 2015
{
   "pageInfo": {
         "pageName": "abc",
         "pagePic": "http://example.com/content.jpg"
    },
    "posts": [
         {
              "post_id": "123456789012_123456789012",
              "actor_id": "1234567890",
              "picOfPersonWhoPosted": "http://example.com/photo.jpg",
              "nameOfPersonWhoPosted": "Jane Doe",
              "message": "Sounds cool. Can't wait to see it!",
              "likesCount": "2",
              "comments": [],
              "timeOfPost": "1234567890"
         }
    ]
}

Java code :

JSONObject obj = new JSONObject(responsejsonobj);
String pageName = obj.getJSONObject("pageInfo").getString("pageName");

JSONArray arr = obj.getJSONArray("posts");
for (int i = 0; i < arr.length(); i++)
{
    String post_id = arr.getJSONObject(i).getString("post_id");
    ......etc
}
4 голосов
/ 23 июля 2016

Лучшие ответы на этой странице используют слишком простые примеры, например, объект с одним свойством (например, {name: value}). Я думаю, что этот простой, но реальный пример может кому-то помочь.

Итак, это JSON, возвращаемый Google Translate API:

{
  "data": 
     {
        "translations": 
          [
            {
              "translatedText": "Arbeit"
             }
          ]
     }
}

Я хочу получить значение атрибута "translationText", например, "Arbeit" с помощью Google Gson.

Два возможных подхода:

  1. Получить только один необходимый атрибут

    String json  = callToTranslateApi("work", "de");
    JsonObject jsonObject = new JsonParser().parse(json).getAsJsonObject();
    return jsonObject.get("data").getAsJsonObject()
            .get("translations").getAsJsonArray()
            .get(0).getAsJsonObject()
            .get("translatedText").getAsString();
    
  2. Создание объекта Java из JSON

    class ApiResponse {
        Data data;      
        class Data {
            Translation[] translations;         
            class Translation {
                String translatedText;
            }
         }
     }
    

    ... * * 1020

     Gson g = new Gson();
     String json =callToTranslateApi("work", "de");
     ApiResponse response = g.fromJson(json, ApiResponse.class);
     return response.data.translations[0].translatedText;
    
4 голосов
/ 21 ноября 2016

Сначала вам нужно выбрать библиотеку реализации , чтобы сделать это.

Java API для обработки JSON (JSR 353) предоставляет переносимые API для анализа, создания, преобразования и запроса JSON с использованием объектной модели и потоковых API.

Ссылочная реализация находится здесь: https://jsonp.java.net/

Здесь вы можете найти список реализаций JSR 353:

Какие API реализуют JSR-353 (JSON)

И , чтобы помочь вам решить ... Я также нашел эту статью:

http://blog.takipi.com/the-ultimate-json-library-json-simple-vs-gson-vs-jackson-vs-json/

Если вы выбираете Джексона, вот хорошая статья о преобразовании между JSON в / из Java с использованием Джексона: https://www.mkyong.com/java/how-to-convert-java-object-to-from-json-jackson/

Надеюсь, это поможет!

3 голосов
/ 26 июля 2016

Вы можете использовать Jayway JsonPath . Ниже приведена ссылка на GitHub с исходным кодом, подробностями о pom и хорошей документацией.

https://github.com/jayway/JsonPath

Пожалуйста, выполните следующие шаги.

Шаг 1 : Добавьте зависимость пути JSON Jayway в путь к классу с помощью Maven или загрузите файл JAR и добавьте его вручную.

<dependency>
            <groupId>com.jayway.jsonpath</groupId>
            <artifactId>json-path</artifactId>
            <version>2.2.0</version>
</dependency>

Шаг 2 : Пожалуйста, сохраните ваш входной JSON как файл для этого примера. В моем случае я сохранил ваш JSON как sampleJson.txt. Обратите внимание, что вы пропустили запятую между pageInfo и публикациями.

Шаг 3 : Считайте содержимое JSON из вышеуказанного файла с помощью bufferedReader и сохраните его как String.

BufferedReader br = new BufferedReader(new FileReader("D:\\sampleJson.txt"));

        StringBuilder sb = new StringBuilder();
        String line = br.readLine();

        while (line != null) {
            sb.append(line);
            sb.append(System.lineSeparator());
            line = br.readLine();
        }
        br.close();
        String jsonInput = sb.toString();

Шаг 4 : проанализируйте строку JSON с помощью JSON-анализатора JSON.

Object document = Configuration.defaultConfiguration().jsonProvider().parse(jsonInput);

Шаг 5 : прочтите подробности, как показано ниже.

String pageName = JsonPath.read(document, "$.pageInfo.pageName");
String pagePic = JsonPath.read(document, "$.pageInfo.pagePic");
String post_id = JsonPath.read(document, "$.posts[0].post_id");

System.out.println("$.pageInfo.pageName " + pageName);
System.out.println("$.pageInfo.pagePic " + pagePic);
System.out.println("$.posts[0].post_id " + post_id);

Вывод будет :

$.pageInfo.pageName = abc
$.pageInfo.pagePic = http://example.com/content.jpg
$.posts[0].post_id  = 123456789012_123456789012
2 голосов
/ 19 октября 2018

jsoniter (jsoniterator) - относительно новая и простая библиотека json, разработанная, чтобы быть простой и быстрой.Все, что вам нужно сделать для десериализации данных json, это

JsonIterator.deserialize(jsonData, int[].class);

, где jsonData - это строка данных json.

Посетите официальный веб-сайт для получения дополнительной информации..

2 голосов
/ 16 сентября 2016

У меня есть JSON вот так:

{
   "pageInfo": {
         "pageName": "abc",
         "pagePic": "http://example.com/content.jpg"
    }
}

Java класс

class PageInfo {

    private String pageName;
    private String pagePic;

    // Getters and setters
}

Код для преобразования этого JSON в класс Java.

    PageInfo pageInfo = JsonPath.parse(jsonString).read("$.pageInfo", PageInfo.class);

Maven

<dependency>
    <groupId>com.jayway.jsonpath</groupId>
    <artifactId>json-path</artifactId>
    <version>2.2.0</version>
</dependency>
1 голос
/ 30 марта 2019

Вы можете использовать DSM потоковую библиотеку для анализа сложных json и XML-документов.DSM анализирует данные только один раз и не загружает все данные в память.

Допустим, у нас есть класс Page для десериализации данных json.

Класс страницы

public class Page {
    private String pageName;
    private String pageImage;
    private List<Sting> postIds;

    // getter/setter

}

Создание файла отображения yaml.

result:
  type: object     # result is array
  path: /posts
  fields:
    pageName:
        path: /pageInfo/pageName
    pageImage:
        path: /pageInfo/pagePic
    postIds:
      path: post_id
      type: array

Используйте DSM для извлечения полей.

DSM dsm=new DSMBuilder(new File("path-to-yaml-config.yaml")).create(Page.class);
Page page= (Page)dsm.toObject(new path-to-json-data.json");

page переменная сериализована в json:

{
  "pageName" : "abc",
  "pageImage" : "http://example.com/content.jpg",
  "postIds" : [ "123456789012_123456789012" ]
}

DSM очень хорош длякомплекс JSON и XML.

1 голос
/ 21 ноября 2017

Можно использовать Apache @Model аннотация для создания Java моделей классов, представляющих структуру файлов JSON , и использовать их для доступа к различным элементам JSON дерево. В отличие от других решений, это работает полностью без отражения и, таким образом, подходит для сред, где отражение невозможно или имеет значительные накладные расходы.

Существует пример проекта Maven , показывающий использование. Прежде всего это определяет структуру:

@Model(className="RepositoryInfo", properties = {
    @Property(name = "id", type = int.class),
    @Property(name = "name", type = String.class),
    @Property(name = "owner", type = Owner.class),
    @Property(name = "private", type = boolean.class),
})
final class RepositoryCntrl {
    @Model(className = "Owner", properties = {
        @Property(name = "login", type = String.class)
    })
    static final class OwnerCntrl {
    }
}

и затем он использует сгенерированные классы RepositoryInfo и Owner для анализа предоставленного входного потока и получения определенной информации при этом:

List<RepositoryInfo> repositories = new ArrayList<>();
try (InputStream is = initializeStream(args)) {
    Models.parse(CONTEXT, RepositoryInfo.class, is, repositories);
}

System.err.println("there is " + repositories.size() + " repositories");
repositories.stream().filter((repo) -> repo != null).forEach((repo) -> {
    System.err.println("repository " + repo.getName() + 
        " is owned by " + repo.getOwner().getLogin()
    );
})

Вот и все! В дополнение к этому здесь live gist , показывающий подобный пример вместе с асинхронной сетевой связью.

1 голос
/ 11 апреля 2017

Мы можем использовать класс JSONObject для преобразования строки JSON в объект JSON, и перебирать объект JSON. Используйте следующий код.

JSONObject jObj = new JSONObject(contents.trim());
Iterator<?> keys = jObj.keys();

while( keys.hasNext() ) {
  String key = (String)keys.next();
  if ( jObj.get(key) instanceof JSONObject ) {           
    System.out.println(jObj.getString(String key));
  }
}
0 голосов
/ 17 мая 2018

Вам нужно использовать классы JsonNode и ObjectMapper из библиотеки Джексона для извлечения узлов вашего дерева Json. Добавьте нижеприведенную зависимость в ваш файл pom.xml, чтобы получить доступ к классам Джексона.

<!-- https://mvnrepository.com/artifact/com.fasterxml.jackson.core/jackson-databind -->
<dependency>
    <groupId>com.fasterxml.jackson.core</groupId>
    <artifactId>jackson-databind</artifactId>
    <version>2.9.5</version>
</dependency>

Вы должны попробовать следующий код, это сработает:

import com.fasterxml.jackson.core.JsonGenerationException;
import com.fasterxml.jackson.databind.JsonMappingException;
import com.fasterxml.jackson.databind.JsonNode;
import com.fasterxml.jackson.databind.ObjectMapper;

Class JsonNodeExtractor{

public void convertToJson(){


String filepath = "c:\\data.json";
ObjectMapper mapper = new ObjectMapper();
JsonNode node =  mapper.readTree(filepath);

// create a JsonNode for every root or subroot element in the Json String
JsonNode pageInfoRoot = node.path("pageInfo");

// Fetching elements under 'pageInfo'
String pageName =  pageInfoRoot.path("pageName").asText();
String pagePic = pageInfoRoot.path("pagePic").asText();

// Now fetching elements under posts
JsonNode  postsNode = node.path("posts");
String post_id = postsNode .path("post_id").asText();
String nameOfPersonWhoPosted = postsNode 
.path("nameOfPersonWhoPosted").asText();

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