[java] Java에서 JSON을 구문 분석하는 방법

다음 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"
         }
    ]
}



답변

org.json의 라이브러리를 사용하기 쉽습니다. 아래 예제 코드 :

import org.json.*;

String jsonString = ... ; //assign your JSON String here
JSONObject obj = new JSONObject(jsonString);
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");
    ......
}

Java에서 JSON 구문 분석 에서 더 많은 예제를 찾을 수 있습니다.

다운로드 가능한 jar : http://mvnrepository.com/artifact/org.json/json


답변

예를 위해서이 클래스가 있다고 가정 할 수 있습니다 Person단지와를 name.

private class Person {
    public String name;

    public Person(String name) {
        this.name = name;
    }
}

Google GSON ( 메이븐 )

객체의 JSON 직렬화 / 역 직렬화에 대한 개인적 선호.

Gson g = new Gson();

Person person = g.fromJson("{\"name\": \"John\"}", Person.class);
System.out.println(person.name); //John

System.out.println(g.toJson(person)); // {"name":"John"}

최신 정보

단일 속성을 얻으려면 Google 라이브러리에서도 쉽게 수행 할 수 있습니다.

JsonObject jsonObject = new JsonParser().parse("{\"name\": \"John\"}").getAsJsonObject();

System.out.println(jsonObject.get("name").getAsString()); //John

조직 JSON ( Maven )

객체 역 직렬화가 필요하지 않지만 단순히 속성을 얻으려면 org.json을 시도하십시오 ( 또는 위의 GSON 예를 보십시오 ! )

JSONObject obj = new JSONObject("{\"name\": \"John\"}");

System.out.println(obj.getString("name")); //John

잭슨 ( 메이븐 )

ObjectMapper mapper = new ObjectMapper();
Person user = mapper.readValue("{\"name\": \"John\"}", Person.class);

System.out.println(user.name); //John


답변

  1. JSON에서 Java 객체를 생성하거나 그 반대의 경우 GSON 또는 JACKSON 타사 항아리 등을 사용하십시오.

    //from object to JSON 
    Gson gson = new Gson();
    gson.toJson(yourObject);
    
    // from JSON to object 
    yourObject o = gson.fromJson(JSONString,yourObject.class);
  2. 그러나 JSON 문자열을 구문 분석하고 일부 값을 얻으려면 (또는 JSON 문자열을 처음부터 작성하여 와이어를 통해 보내려면) JsonReader, JsonArray, JsonObject 등이 포함 된 JaveEE jar을 사용하십시오. javax.json과 같은 스펙. 이 두 항아리로 json을 구문 분석하고 값을 사용할 수 있습니다.

    이러한 API는 실제로 XML의 DOM / SAX 구문 분석 모델을 따릅니다.

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

답변

quick-json 파서 는 매우 간단하고 유연하며 매우 빠르고 사용자 정의가 가능합니다. 시도 해봐

풍모:

  • JSON 사양 준수 (RFC4627)
  • 고성능 JSON 파서
  • 유연하고 구성 가능한 구문 분석 방식 지원
  • 모든 JSON 계층의 키 / 값 쌍에 대한 구성 가능한 검증
  • 사용하기 쉬운 # 매우 작은 설치 공간
  • 개발자 친화적이고 예외 추적이 용이
  • 플러그 형 사용자 정의 유효성 검사 지원-발생시 및 사용자 정의 유효성 검사기를 구성하여 키 / 값을 확인할 수 있습니다.
  • 유효성 검사 및 유효성 검사가 아닌 파서 지원
  • quick-JSON 유효성 검증 파서를 사용하기위한 두 가지 유형의 구성 (JSON / XML) 지원
  • JDK 1.5 필요
  • 외부 라이브러리에 의존하지 않습니다
  • 객체 직렬화를 통한 JSON 생성 지원
  • 파싱 ​​과정에서 수집 유형 선택 지원

다음과 같이 사용할 수 있습니다 :

JsonParserFactory factory=JsonParserFactory.getInstance();
JSONParser parser=factory.newJsonParser();
Map jsonMap=parser.parseJson(jsonString);


답변

Google Gson을 사용할 수 있습니다 .

이 라이브러리를 사용하면 동일한 JSON 구조로 모델 만 작성하면됩니다. 그런 다음 모델이 자동으로 채워집니다. 변수를 JSON 키로 호출하거나 @SerializedName다른 이름을 사용하려는 경우 사용해야합니다.

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

모델

class MyModel {

    private PageInfo pageInfo;
    private ArrayList<Post> posts = new ArrayList<>();
}

class PageInfo {

    private String pageName;
    private String pagePic;
}

class Post {

    private String post_id;

    @SerializedName("actor_id") // <- example SerializedName
    private String actorId;

    private String picOfPersonWhoPosted;
    private String nameOfPersonWhoPosted;
    private String message;
    private String likesCount;
    private ArrayList<String> comments;
    private String timeOfPost;
}

파싱

이제 Gson 라이브러리를 사용하여 구문 분석 할 수 있습니다.

MyModel model = gson.fromJson(jsonString, MyModel.class);

Gradle 가져 오기

앱 Gradle 파일에서 라이브러리를 가져와야 함

implementation 'com.google.code.gson:gson:2.8.6' // or earlier versions

자동 모델 생성

JSON은 자동으로 같은 온라인 도구를 사용하는 당신은 모델을 생성 할 수 있습니다 .


답변

주어진 거의 모든 답변은 관심있는 속성의 값에 액세스하기 전에 JSON을 Java 객체로 완전히 직렬화 해제해야합니다. 이 경로를 따르지 않는 또 다른 대안 은 JSON의 XPath와 같은 JsonPATH 를 사용 하고 JSON 객체를 통과 할 수 있도록하는 것입니다.

JayWay의 사양이며 좋은 사람들은 사양에 대한 Java 구현을 만들었습니다. https://github.com/jayway/JsonPath

기본적으로 사용하려면 프로젝트에 다음과 같이 추가하십시오.

<dependency>
    <groupId>com.jayway.jsonpath</groupId>
    <artifactId>json-path</artifactId>
    <version>${version}</version>
</dependency>

그리고 사용 :

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

기타…

JSON을 가로 지르는 다른 방법에 대한 자세한 정보는 JsonPath 스펙 페이지를 확인하십시오.


답변

A-설명

Jackson String을 사용하여 JSON String을 POJO ( Plain Old Java Object ) 인스턴스 에 바인딩 할 수 있습니다 . POJO는 단순히 개인 필드와 공용 getter / setter 메소드 만있는 클래스입니다. Jackson은 리플렉션을 사용하여 메소드를 탐색하고 클래스의 필드 이름이 JSON 오브젝트의 필드 이름에 맞게 JSON 오브젝트를 POJO 인스턴스에 맵핑합니다.

실제로 복합 객체 인 JSON 객체 에서 주 객체는 두 개의 하위 객체로 구성됩니다. 따라서 POJO 클래스는 동일한 계층 구조를 가져야합니다. 전체 JSON 객체를 Page 객체라고합니다. Page 개체는 PageInfo 개체와 Post 개체 배열로 구성됩니다.

따라서 우리는 세 가지 POJO 클래스를 만들어야합니다.

  • 페이지 클래스하는 복합 PageInfo 의 클래스와 배열 포스트 인스턴스
  • PageInfo 클래스
  • 게시물 클래스

내가 사용한 유일한 패키지는 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 클래스 : 페이지

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