13

Как разобрать JSON в Java

11

У меня есть следующий 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"
    }
  ]
}

Необходимо узнать, как правильно извлечь данные из этого JSON в языке программирования, который я использую.

5 ответ(ов)

1

Если вы хотите создать объект Java из JSON и наоборот, можете использовать сторонние библиотеки, такие как GSON или JACKSON. Примеры кода:

// Из объекта в JSON
Gson gson = new Gson();
String jsonString = gson.toJson(yourObject);

// Из JSON в объект
YourObject o = gson.fromJson(jsonString, YourObject.class);

Если же вам просто нужно разобрать строку JSON и получить некоторые значения (или создать JSON-строку с нуля для передачи по сети), используйте JavaEE библиотеку, которая содержит JsonReader, JsonArray, JsonObject и т.д. Вы можете скачать реализацию этого специфика, например, javax.json. С помощью этих двух библиотек я смог разобрать JSON и использовать его значения.

Эти API фактически следуют модели парсинга DOM/SAX, подобно XML:

Response response = request.get(); // Вызов REST
JsonReader jsonReader = Json.createReader(new StringReader(response.readEntity(String.class)));
JsonArray jsonArray = jsonReader.readArray();
ListIterator<JsonObject> l = jsonArray.listIterator();
while (l.hasNext()) {
    JsonObject j = l.next();
    JsonObject ciAttr = j.getJsonObject("ciAttributes");
}

Надеюсь, это поможет вам в работе с JSON в Java!

0

A - Пояснение

Вы можете использовать библиотеки Jackson для связывания JSON-строки с экземплярами POJO (Plain Old Java Object). POJO — это просто класс с приватными полями и публичными методами-геттерами и сеттерами. Jackson будет проходить по методам (используя рефлексию) и сопоставлять JSON-объект с экземпляром POJO, поскольку имена полей класса соответствуют именам полей JSON-объекта.

В вашем JSON-объекте, который на самом деле является составным объектом, основной объект состоит из двух под-объектов. Таким образом, наши классы POJO должны иметь ту же иерархию. Я буду называть весь JSON-объект объектом Page. Объект Page состоит из объекта PageInfo и массива объектов Post.

Поэтому нам нужно создать три различных класса POJO:

  • Класс Page, который является составным из класса PageInfo и массива экземпляров Post
  • Класс PageInfo
  • Класс Post

Единственный пакет, который я использовал, — это Jackson ObjectMapper. Мы связываем данные с помощью:

com.fasterxml.jackson.databind.ObjectMapper

Необходимые зависимости (jar-файлы) указаны ниже:

  • jackson-core-2.5.1.jar
  • jackson-databind-2.5.1.jar
  • jackson-annotations-2.5.0.jar

Вот необходимый код:

B - Основной класс POJO : Page

package com.levo.jsonex.model;

public class Page {
    
    private PageInfo pageInfo;
    private Post[] posts;

    public PageInfo getPageInfo() {
        return pageInfo;
    }

    public void setPageInfo(PageInfo pageInfo) {
        this.pageInfo = pageInfo;
    }

    public Post[] getPosts() {
        return posts;
    }

    public void setPosts(Post[] posts) {
        this.posts = posts;
    }
    
}

C - Дочерний класс POJO : PageInfo

package com.levo.jsonex.model;

public class PageInfo {
    
    private String pageName;
    private String pagePic;
    
    public String getPageName() {
        return pageName;
    }
    
    public void setPageName(String pageName) {
        this.pageName = pageName;
    }
    
    public String getPagePic() {
        return pagePic;
    }
    
    public void setPagePic(String pagePic) {
        this.pagePic = pagePic;
    }
    
}

D - Дочерний класс POJO : Post

package com.levo.jsonex.model;

public class Post {
    
    private String post_id;
    private String actor_id;
    private String picOfPersonWhoPosted;
    private String nameOfPersonWhoPosted;
    private String message;
    private int likesCount;
    private String[] comments;
    private int timeOfPost;

    public String getPost_id() {
        return post_id;
    }

    public void setPost_id(String post_id) {
        this.post_id = post_id;
    }

    public String getActor_id() {
        return actor_id;
    }

    public void setActor_id(String actor_id) {
        this.actor_id = actor_id;
    }

    public String getPicOfPersonWhoPosted() {
        return picOfPersonWhoPosted;
    }
    
    public void setPicOfPersonWhoPosted(String picOfPersonWhoPosted) {
        this.picOfPersonWhoPosted = picOfPersonWhoPosted;
    }

    public String getNameOfPersonWhoPosted() {
        return nameOfPersonWhoPosted;
    }

    public void setNameOfPersonWhoPosted(String nameOfPersonWhoPosted) {
        this.nameOfPersonWhoPosted = nameOfPersonWhoPosted;
    }

    public String getMessage() {
        return message;
    }

    public void setMessage(String message) {
        this.message = message;
    }

    public int getLikesCount() {
        return likesCount;
    }

    public void setLikesCount(int likesCount) {
        this.likesCount = likesCount;
    }

    public String[] getComments() {
        return comments;
    }

    public void setComments(String[] comments) {
        this.comments = comments;
    }

    public int getTimeOfPost() {
        return timeOfPost;
    }

    public void setTimeOfPost(int timeOfPost) {
        this.timeOfPost = timeOfPost;
    }
    
}

E - Пример JSON-файла : sampleJSONFile.json

Я просто скопировал ваш JSON-пример в этот файл и положил его в папку проекта.

{
   "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"
         }
    ]
}

F - Демонстрационный код

package com.levo.jsonex;

import java.io.File;
import java.io.IOException;
import java.util.Arrays;

import com.fasterxml.jackson.databind.ObjectMapper;
import com.levo.jsonex.model.Page;
import com.levo.jsonex.model.PageInfo;
import com.levo.jsonex.model.Post;

public class JSONDemo {
    
    public static void main(String[] args) {
        ObjectMapper objectMapper = new ObjectMapper();
        
        try {
            Page page = objectMapper.readValue(new File("sampleJSONFile.json"), Page.class);
            
            printParsedObject(page);
        } catch (IOException e) {
            e.printStackTrace();
        }
        
    }
    
    private static void printParsedObject(Page page) {
        printPageInfo(page.getPageInfo());
        System.out.println();
        printPosts(page.getPosts());
    }

    private static void printPageInfo(PageInfo pageInfo) {
        System.out.println("Page Info;");
        System.out.println("**********");
        System.out.println("\tPage Name : " + pageInfo.getPageName());
        System.out.println("\tPage Pic  : " + pageInfo.getPagePic());
    }
    
    private static void printPosts(Post[] posts) {
        System.out.println("Page Posts;");
        System.out.println("**********");
        for(Post post : posts) {
            printPost(post);
        }
    }
    
    private static void printPost(Post post) {
        System.out.println("\tPost Id                   : " + post.getPost_id());
        System.out.println("\tActor Id                  : " + post.getActor_id());
        System.out.println("\tPic Of Person Who Posted  : " + post.getPicOfPersonWhoPosted());
        System.out.println("\tName Of Person Who Posted : " + post.getNameOfPersonWhoPosted());
        System.out.println("\tMessage                   : " + post.getMessage());
        System.out.println("\tLikes Count               : " + post.getLikesCount());
        System.out.println("\tComments                  : " + Arrays.toString(post.getComments()));
        System.out.println("\tTime Of Post              : " + post.getTimeOfPost());
    }
    
}

G - Результат демонстрации

Page Info;
**********
    Page Name : abc
    Page Pic  : http://example.com/content.jpg
Page Posts;
**********
    Post Id                   : 123456789012_123456789012
    Actor Id                  : 1234567890
    Pic Of Person Who Posted  : http://example.com/photo.jpg
    Name Of Person Who Posted : Jane Doe
    Message                   : Sounds cool. Can't wait to see it!
    Likes Count               : 2
    Comments                  : []
    Time Of Post              : 1234567890
0

Это просто потрясающе, как все легко. Вы можете просто передать строку, содержащую ваш JSON, в конструктор JSONObject из стандартного пакета org.json.

JSONArray rootOfPage = new JSONArray(JSONString);

Готово. Бросает микрофон. Это также работает и с JSONObjects. После этого вы можете просто просматривать свою иерархию объектов, используя методы get() на ваших объектах.

0

Gson — это простая в изучении и реализации библиотека для работы с JSON в Java. Вам следует знать о двух основных методах:

  • toJson() – преобразует объект Java в формат JSON.
  • fromJson() – преобразует JSON в объект Java.

Вот пример использования метода fromJson() для чтения JSON-данных из файла:

import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;
import com.google.gson.Gson;

public class GsonExample {
    public static void main(String[] args) {
        Gson gson = new Gson();
        
        try {
            BufferedReader br = new BufferedReader(new FileReader("c:\\file.json"));
            
            // преобразуем строку JSON обратно в объект
            DataObject obj = gson.fromJson(br, DataObject.class);
            
            System.out.println(obj);
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

В этой примере мы создаем экземпляр Gson, читаем JSON данные из файла с помощью BufferedReader, а затем преобразуем их в объект класса DataObject. Не забудьте обрабатывать возможные исключения ввода-вывода!

0

Конечно! В вашем случае вы можете использовать библиотеку JSON.simple для разбора JSON-строки. Вот как это можно сделать:

JSONParser jsonParser = new JSONParser();
JSONObject jsonObject = (JSONObject) jsonParser.parse(contentString);
String productId = (String) jsonObject.get("productId");

В этом коде мы создаем экземпляр JSONParser, а затем используем метод parse, чтобы преобразовать строку contentString в объект JSONObject. После этого мы получаем значение productId с помощью метода get. Не забудьте обработать возможные исключения, такие как ParseException, которые могут возникнуть при разборе JSON.

Чтобы ответить на вопрос, пожалуйста, войдите или зарегистрируйтесь