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


1048

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

7
java의 내장 JSON 라이브러리는 그렇게하는 빠른 방법이지만 내 경험에 따르면 GSON은 JSON을 POJO로 쉽게 파싱하는 데 가장 적합한 라이브러리입니다.
Iman Akbari

16
이것은 먼저 높은 투표와 그의 대답 내가 가장 혼란 발견 보호 질문입니다
Riyafa 압둘 하미드를

6
@JaysonMinard는 동의했다. 모드 개입을 요청했습니다. 이것은 정말로 닫아야합니다. 나는 처음에 (잘못) 질문이 보호되는 동안 그렇게 할 수 없다고 생각했기 때문에 그것을 보호하지 않고 내 일을했습니다. 모드를 기다리는 동안 낮은 응답 응답 등을 방지하기 위해 다시 보호했습니다.
Mena

4
"이 질문은 어떠한 연구 노력도 보여주지 않습니다"-Downvote 버튼 툴팁
Jean-François Corbett

6
이 질문은 메타대해 논의되고 있습니다.
Mark Amery

답변:


753

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


15
@StaxMan에 동의합니다. 방금 org.json을 시도했는데 정말 번거 롭습니다. 예를 들어 표준 Java Collection 유형에서는 작동하지 않습니다.
Ken Williams

7
@StaxMan 보지 org.json않고 간단한 JSON 파싱을 위해 다른 라이브러리를 선택합니다 . Douglas Crockford (JSON 발견 자)가 작성한 참조 라이브러리입니다.
Omar Al-Ithawi

31
@OmarIthawi 그것은 바보입니다. 어색한 API, 비효율적 인 구현의 개념 증명입니다. 필자는 저자의 가시성에서 품질을 추론하는 대신 자체 장점으로 라이브러리를 고려하는 것이 좋습니다. Doug는 많은 것을 달성했지만 실제로 특정 라이브러리의 품질을 변경하지는 않습니다. 10 년 전만해도이 도시에서 유일하게 게임 이었지만 그 이후로 많은 긍정적 인 진전이있었습니다. json libs의 Struts와 같습니다.
StaxMan

12
org.json은 최악의 json 라이브러리 중 하나입니다. 선택하기 전에 사용 가능한 json 라이브러리의 기능 세트와 성능을 살펴 봐야합니다. 다음은 JMH를 사용하여 jackson, gson, org.json, genson을 비교 한 벤치 마크입니다 : github.com/fabienrenaud/java-json-benchmark . 잭슨이 확실한 승자입니다.
fabien

4
라이센스에는 일반적으로 사용되는 오픈 소스 라이센스가 포함되어 있지 않으며 저작권도 보유합니다.
Christian Vielma

536

예를 위해서이 클래스가 있다고 가정 할 수 있습니다 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

16
좋은 대답입니다. 사소한 개선에 대한 한 가지 제안 : GSON과 Jackson 모두 JSON 트리 표현 사용을 지원합니다 (Jackson JsonNode의 경우 GSON과 유사합니다). 스 니펫은 org.json이 제공하는 유일한 방법과 유사하므로 스 니펫을 표시하는 것이 좋습니다.
StaxMan

언급 할 가치가있는 두 개의 다른 라이브러리 : 완전성 ( json-simple)Oracle의 JSONP
jake stayman

3
@NeonWarge, 왜? 이 답변은 JSON 문자열과 정확히 동일한 필드를 포함하는 Java 클래스를 이미 정의했다고 가정합니다. 이것은 매우 강력한 가정입니다.
Andrea Lazzarotto

1
json-simple 및 oracle의 jsonp는 끔찍하게 수행합니다. github.com/fabienrenaud/java-json-benchmark 성능을 위해 jackson 또는 dsljson을 선택하십시오.
fabien

GSON은 루트 이외의 레벨에서 필드의 동적 필터링을 지원하지 않습니다!
Gangnus

102
  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");

4
@nondescript 추측해야한다면, 원래 포스터의 질문에 답하지 않기 때문에 다운 보트되었다고 말할 것입니다. "필요한 코드는 무엇입니까?" 공표 된 답변은 코드 스 니펫을 제공했습니다.
jewbix.cube

4
참고 : Jackson과 GSON은 모두 트리 스타일 및 / 또는 맵 /리스트 바인딩을 지원하므로 Java EE (javax.json) 패키지를 사용할 필요가 없습니다. javax.json은 Jackson이나 GSON 이상의 기능을 거의 제공하지 않습니다.
StaxMan

JavaEE 라이브러리에 대한 링크를 추가하는 것이 좋습니다.
Basil Bourque

72

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);

3
사용 가능한 javadoc이 있습니까?
jboi

24
이 패키지는 구문 분석시 빈 값을 처리 할 수 ​​없습니다. 예 : ... "description": ""... 예외가 발생 함
Ivan

6
code.google.com/p/quick-json/issues/detail?id=11 에서이 문제 (및 기타 여러 가지) 를 수정했습니다. 저자가 공식 릴리스에서 문제를 해결하는 데 시간이 걸리기를 바랍니다.
noamik

8
나열된 기능 중에서 다른 옵션과 비교할 때 고유 한 것은 없으며 성능에 대한 주장은 아무것도 지원하지 않습니다. 더 라이브러리와 같은 벤치 마크에 포함되어 있습니다 (GSON, 잭슨, Genson, 보탬이) 성숙을 위해 달리 github.com/eishay/jvm-serializers , github.com/novoj/JavaJsonPerformanceTest 또는 developer.com/lang/jscript/... I를 - 이 라이브러리가 테스트에 포함되지 않았거나 널리 사용되는 것에 대한 언급은 없었습니다.
StaxMan

26
이 프로젝트는 죽었고 중앙 Maven 저장소에서 더 이상 호스팅되지 않는 것으로 보입니다.
8bitjunkie

40

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은 자동으로 같은 온라인 도구를 사용하는 당신은 모델을 생성 할 수 있습니다 .


38

주어진 거의 모든 답변은 관심있는 속성의 값에 액세스하기 전에 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 스펙 페이지를 확인하십시오.


이것은 특히 JSON을 읽고 업데이트하는 데 매우 유용한 라이브러리이지만이 라이브러리에 대해 알려진 문제를주의하십시오. [1] 참조 : github.com/json-path/JsonPath/issues/272 [2] : github.com/json-path/JsonPath/issues/375
papigee

38

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

26

사용 을 최소화-JSON 매우 빠르고 사용하기 쉽습니다. String obj 및 Stream에서 구문 분석 할 수 있습니다.

샘플 데이터 :

{
  "order": 4711,
  "items": [
    {
      "name": "NE555 Timer IC",
      "cat-id": "645723",
      "quantity": 10,
    },
    {
      "name": "LM358N OpAmp IC",
      "cat-id": "764525",
      "quantity": 2
    }
  ]
}

파싱 ​​:

JsonObject object = Json.parse(input).asObject();
int orders = object.get("order").asInt();
JsonArray items = object.get("items").asArray();

JSON 만들기 :

JsonObject user = Json.object().add("name", "Sakib").add("age", 23);

메이븐 :

<dependency>
  <groupId>com.eclipsesource.minimal-json</groupId>
  <artifactId>minimal-json</artifactId>
  <version>0.9.4</version>
</dependency>

포조는 어떻게 보일까요?
Jesse

Pojo의 경우 gson을 사용하십시오. 이 라이브러리는 지원하지 않습니다.
Sakib Sami

22

모범 사례 는 여전히 진행중인 공식 Java JSON API 를 거치는 것입니다.


7
대답 한 이후 Jackson을 사용하기 시작했으며 JSON 역 직렬화를위한 최고의 라이브러리 중 하나라고 생각합니다.
Giovanni Botta

2
Padding에서 JSON과 다른 의미로 JSONP를 재사용하는 이유는 무엇 입니까? ...
Chris Wesseling

@ChrisWesseling 무슨 뜻인가요?
Giovanni Botta

"JSON-P (Java JSON for Java Processing)"는 링크하는 문서의 제목입니다. JSONP가 다른 것을 의미한다는 것을 알았 기 때문에 혼란 스럽습니다.
Chris Wesseling

1
@ChrisWesseling 아 혼란 스럽습니다. 그것이 그들이 사양을 위해 선택한 것입니다. 그러나 내가 말했듯이, 나는 Jackson에게 곧장 갈 것이다.
Giovanni Botta

22

아무도 그것을 언급하지 않았으므로 다음은 Nashorn (Java 8의 JavaScript 런타임 부분이지만 Java 11에서는 더 이상 사용되지 않음)을 사용하는 솔루션의 시작입니다 .

해결책

private static final String EXTRACTOR_SCRIPT =
    "var fun = function(raw) { " +
    "var json = JSON.parse(raw); " +
    "return [json.pageInfo.pageName, json.pageInfo.pagePic, json.posts[0].post_id];};";

public void run() throws ScriptException, NoSuchMethodException {
    ScriptEngine engine = new ScriptEngineManager().getEngineByName("nashorn");
    engine.eval(EXTRACTOR_SCRIPT);
    Invocable invocable = (Invocable) engine;
    JSObject result = (JSObject) invocable.invokeFunction("fun", JSON);
    result.values().forEach(e -> System.out.println(e));
}

성능 비교

각각 20, 20 및 100 요소로 구성된 3 개의 배열을 포함하는 JSON 내용을 작성했습니다. 세 번째 배열에서 100 개의 요소 만 가져오고 싶습니다. 다음 JavaScript 함수를 사용하여 항목을 구문 분석하고 가져옵니다.

var fun = function(raw) {JSON.parse(raw).entries};

Nashorn을 사용하여 백만 번 전화를 걸려면 7.5 ~ 7.8 초 소요

(JSObject) invocable.invokeFunction("fun", json);

org.json 은 20 ~ 21 초 걸립니다

new JSONObject(JSON).getJSONArray("entries");

잭슨 은 6.5 ~ 7 초 걸립니다

mapper.readValue(JSON, Entries.class).getEntries();

이 경우 Jackson은 Nashorn보다 성능이 좋으며 org.json보다 성능이 훨씬 우수합니다. Nashorn API는 org.json 또는 Jackson보다 사용하기가 어렵습니다. 요구 사항에 따라 Jackson과 Nashorn은 모두 실용적인 솔루션이 될 수 있습니다.


1
" "" 단위는 무엇입니까 ? 인치가 아닙니까? 몇 초입니까? 의사록?
피터 Mortensen

1
@PeterMortensen은 초를 의미합니다. 불분명 해 보이기 때문에 변경하겠습니다. 검토해 주셔서 감사합니다.
otonglet

2
불행히도 Nashorn은 Java 11에서 사용되지 않습니다. JEP 335 .
Per Mildner

1
나는 Nashorn이 더 이상 사용되지 않는다는 것을 알고 있지만 의존성을 원하지 않기 때문에이 답변을 좋아했습니다. 그러나 예제를 약간 다시 작성해야했습니다.ScriptEngine engine = new ScriptEngineManager().getEngineByName("JavaScript"); engine.eval("var fun = function(raw) { return JSON.parse(raw); };"); Map<String, Object> json = (Map<String, Object>) ((Invocable) engine).invokeFunction("fun", jsonString);
kgibm

21

아래 예제는 "jsonText"변수로 표시되는 질문에서 텍스트를 읽는 방법을 보여줍니다. 이 솔루션은 Java EE7 javax.json API (다른 답변 중 일부에서 언급)를 사용합니다. 별도의 답변으로 추가 한 이유는 다음 코드는 질문에 표시된 일부 값 에 실제로 액세스 하는 방법을 보여주기 때문 입니다. javax.json의 API의 구현은 이 코드를 실행할 수 있도록해야 할 것이다. "import"문을 선언하고 싶지 않기 때문에 필요한 각 클래스에 대한 전체 패키지가 포함되었습니다.

javax.json.JsonReader jr = 
    javax.json.Json.createReader(new StringReader(jsonText));
javax.json.JsonObject jo = jr.readObject();

//Read the page info.
javax.json.JsonObject pageInfo = jo.getJsonObject("pageInfo");
System.out.println(pageInfo.getString("pageName"));

//Read the posts.
javax.json.JsonArray posts = jo.getJsonArray("posts");
//Read the first post.
javax.json.JsonObject post = posts.getJsonObject(0);
//Read the post_id field.
String postId = post.getString("post_id");

이제이 답변이 GSON, org.json, Jackson 또는 사용 가능한 다른 타사 프레임 워크를 사용하지 않기 때문에이 답을 내려 가기 전에 제공된 텍스트를 구문 분석하기 위해 질문마다 "필수 코드"의 예입니다. 나는 것을 잘 알고 현재의 표준 JSR 353 준수가 JDK 9 고려되지 않는 한 과 등으로 JSR 353 스펙 구현을 처리 다른 3 자 JSON과 동일하게 취급되어야한다.


15

이것이 얼마나 쉬운 지 내 마음을 사로 잡았습니다. String기본 org.json 패키지의 JSON 객체를 JSONObject 생성자로 전달할 수 있습니다 .

JSONArray rootOfPage =  new JSONArray(JSONString);

끝난. 마이크를 떨어 뜨 립니다. 이것은 또한 작동 JSONObjects합니다. 그런 다음 객체 Objects에서 get()메소드를 사용하는 계층 구조를 살펴볼 수 있습니다.


13
JSONArray유형은 J2SE JDK의 API의 일부가 아닙니다 당신은 API 또는 타사 라이브러리는이 유형을 제공하는 말을하지 않습니다.
Bobulous

2
나는 그것을 사용하는 것이 좋지는 않지만 이것이 json.org/java 의 "org.json"패키지를 참조한다고 생각합니다 . 좋은 자바 라이브러리가 나오기 전에 사용되었지만, 몇 년 전 (2008 년 또는 그 이전)
StaxMan

1
아니면 brainmurphy1 이 Android의 JSONArray 를 의미 합니까?
Alexander Farber

12

Java에는 많은 JSON 라이브러리가 있습니다.

가장 악명 높은 것은 Jackson, GSON, Genson, FastJson 및 org.json입니다.

일반적으로 라이브러리를 선택할 때 세 가지 사항을 고려해야합니다.

  1. 공연
  2. 사용 편의성 (코드 작성이 쉽고 읽기 쉬운 기능)-기능과 함께 제공됩니다.
  3. 모바일 앱의 경우 : 종속성 / jar 크기

특히 JSON 라이브러리 (및 모든 직렬화 / 직렬화 라이브러리)의 경우 데이터 바인딩은 데이터를 포장 / 포장 풀기 위해 보일러 플레이트 코드를 작성할 필요가 없으므로 일반적으로 중요합니다.

1의 경우이 벤치 마크를 참조하십시오 : https://github.com/fabienrenaud/java-json-benchmark 나는 JMH 를 사용하여 스트림을 사용하여 직렬화 기와 직렬화 해제 기의 직렬화 기와 직렬화 해제 기의 성능 (jackson, gson, genson, fastjson, org.json, jsonp)을 비교했습니다. 및 데이터 바인드 API. 2의 경우 인터넷에서 수많은 예를 찾을 수 있습니다. 위의 벤치 마크는 예제 소스로도 사용할 수 있습니다 ...

벤치 마크의 빠른 채택 : Jackson 은 org.json보다 5-6 배, GSON보다 2 배 더 뛰어납니다.

특정 예제의 경우 다음 코드는 json을 jackson으로 디코딩합니다.

public class MyObj {

    private PageInfo pageInfo;
    private List<Post> posts;

    static final class PageInfo {
        private String pageName;
        private String pagePic;
    }

    static final class Post {
        private String post_id;
        @JsonProperty("actor_id");
        private String actorId;
        @JsonProperty("picOfPersonWhoPosted")
        private String pictureOfPoster;
        @JsonProperty("nameOfPersonWhoPosted")
        private String nameOfPoster;
        private String likesCount;
        private List<String> comments;
        private String timeOfPost;
    }

    private static final ObjectMapper JACKSON = new ObjectMapper();
    public static void main(String[] args) throws IOException {
        MyObj o = JACKSON.readValue(args[0], MyObj.class); // assumes args[0] contains your json payload provided in your question.
    }
}

궁금한 점이 있으면 알려주세요.


11

다른 답변 외에도 GSON, Jackson 1.x 또는 Jackson 2.x의 json 또는 json 스키마에서 Java 클래스를 빠르게 생성하기 위해이 온라인 오픈 소스 서비스 jsonschema2pojo.org 를 권장합니다 . 예를 들어 다음과 같은 경우

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

jsonschema2pojo.org GSON에 대한 생성 :

@Generated("org.jsonschema2pojo")
public class Container {
    @SerializedName("pageInfo")
    @Expose
    public PageInfo pageInfo;
    @SerializedName("posts")
    @Expose
    public List<Post> posts = new ArrayList<Post>();
}

@Generated("org.jsonschema2pojo")
public class PageInfo {
    @SerializedName("pageName")
    @Expose
    public String pageName;
    @SerializedName("pagePic")
    @Expose
    public String pagePic;
}

@Generated("org.jsonschema2pojo")
public class Post {
    @SerializedName("post_id")
    @Expose
    public String postId;
    @SerializedName("actor_id")
    @Expose
    public long actorId;
    @SerializedName("picOfPersonWhoPosted")
    @Expose
    public String picOfPersonWhoPosted;
    @SerializedName("nameOfPersonWhoPosted")
    @Expose
    public String nameOfPersonWhoPosted;
    @SerializedName("message")
    @Expose
    public String message;
    @SerializedName("likesCount")
    @Expose
    public long likesCount;
    @SerializedName("comments")
    @Expose
    public List<Object> comments = new ArrayList<Object>();
    @SerializedName("timeOfPost")
    @Expose
    public long timeOfPost;
}

9

JSON 문자열 (jsonString)을 나타내는 Java 클래스 (예 : Message)가있는 경우 Jackson JSON 라이브러리를 다음과 함께 사용할 수 있습니다 .

Message message= new ObjectMapper().readValue(jsonString, Message.class);

메시지 객체에서 속성을 가져올 수 있습니다.


9

Gson 은 배우고 구현하기 쉽고 두 가지 방법을 따라야합니다.

  • toJson () – Java 객체를 JSON 형식으로 변환

  • fromJson () – JSON을 Java 객체로 변환

`

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"));

        //convert the json string back to object
        DataObject obj = gson.fromJson(br, DataObject.class);

        System.out.println(obj);

    } catch (IOException e) {
        e.printStackTrace();
    }

    }
}

`


Gson에 대한 완전한 지식은 아래 링크를 참조하십시오. github.com/google/gson/blob/master/UserGuide.md
venkat

9

JSON 컨텐츠를 오브젝트로 구문 분석하거나 JSON 값을 읽기 위해 존재하는 많은 오픈 소스 라이브러리가 있습니다. 요구 사항은 값을 읽고 사용자 정의 객체로 파싱하는 것입니다. 따라서 귀하의 경우 org.json 라이브러리로 충분합니다.

org.json 라이브러리를 사용하여 구문 분석하고 JsonObject를 작성하십시오.

JSONObject jsonObj = new JSONObject(<jsonStr>);

이제이 객체를 사용하여 값을 얻으십시오.

String id = jsonObj.getString("pageInfo");

여기에서 완전한 예를 볼 수 있습니다.

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


모든 답변에 해당 사이트에 대한 링크가 포함 된 것 같습니다. 스팸 인 경우 중지하십시오. 그렇지 않은 경우 혼란을 끼쳐 드려 죄송하지만 모든 답변에 링크를 게시해야한다고 생각하지 않습니다.
Donald Duck

1
모든 시나리오를 설명 할 수있는 대답을하기가 어렵습니다. 이 경우와 마찬가지로 json 배열 또는 여러 json 객체를 읽는 방법. 그렇게해도 대답이 매우 길어 혼동 될 수 있습니다. 따라서 적절한 예를 통해 적절한 설명이 제공되는 링크를 제공합니다. 그는 방문을 선택하거나 내 설명 만 사용할 수 있습니다.
lalitbhagtani

1
제공 한 링크는 JSON을 읽는 방법 만 보여줍니다. JSON 사용법에 대한 정보는 어디서 찾을 수 있습니까?
Lampros Tzanetos

죄송합니다, 그러나 귀하의 질문을 이해하지 못했습니다 :- "JSON 방법도"
lalitbhagtani

7

다음과 같이하십시오 :

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

10
어,이 도서관은?
Stewart

2
나는 그가 org.json.simple을 사용하고 있다고 생각합니다
Lasitha Yapa

7

Gson Library를 사용하여 JSON 문자열을 구문 분석 할 수 있습니다.

Gson gson = new Gson();
JsonObject jsonObject = gson.fromJson(jsonAsString, JsonObject.class);

String pageName = jsonObject.getAsJsonObject("pageInfo").get("pageName").getAsString();
String pagePic = jsonObject.getAsJsonObject("pageInfo").get("pagePic").getAsString();
String postId = jsonObject.getAsJsonArray("posts").get(0).getAsJsonObject().get("post_id").getAsString();

다음과 같이 "posts"배열을 반복 할 수도 있습니다.

JsonArray posts = jsonObject.getAsJsonArray("posts");
for (JsonElement post : posts) {
  String postId = post.getAsJsonObject().get("post_id").getAsString();
  //do something
}

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

9
코드 전용 답변은 잘 문서화 된 코드보다 훨씬 적은 사람들에게 도움이되므로 답변을 설명하십시오. 를 참조하십시오 "사람에게 물고기를주고 당신은 하루 동안 그에게 먹이, 물고기 사람을 가르치고 당신은 평생 그를 먹이를" .
Wai Ha Lee

이것이 'org.json'lib에 대한 것이라고 언급하면 ​​좋을 것입니다. 그러나 나는 이것이 매우 장황한 방법으로 그것을하는 좋은 방법이라고 생각하지 않으며 'org.json'lib 자체는 쓸모가 없습니다 (느린, 성가신 API). 더 나은 선택이 있습니다 : GSON, Jackson, Boon, Genson.
StaxMan

5

Java에서 다음 블로그 게시물, JSON 읽기 .

이 게시물은 약간 낡았지만 여전히 질문에 대답하고 싶습니다.

1 단계 : 데이터의 POJO 클래스를 작성하십시오.

2 단계 : 이제 JSON을 사용하여 객체를 만듭니다.

Employee employee = null;
ObjectMapper mapper = new ObjectMapper();
try{
    employee =  mapper.readValue(newFile("/home/sumit/employee.json"), Employee.class);
} 
catch (JsonGenerationException e){
    e.printStackTrace();
}

자세한 내용은 다음 링크를 참조하십시오 .


4

이 페이지의 인기 답변은 하나의 속성을 가진 객체 (예 : {name : value})와 같은 너무 간단한 예제를 사용합니다. 나는 여전히 단순하지만 실제 사례가 누군가를 도울 수 있다고 생각합니다.

따라서 이것은 Google Translate API에서 반환 한 JSON입니다.

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

Google의 Gson을 사용하여 "translatedText"속성 값 (예 : "Arbeit")을 검색하려고합니다.

두 가지 가능한 접근 방식 :

  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. JSON에서 Java 객체 생성

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

    ...

     Gson g = new Gson();
     String json =callToTranslateApi("work", "de");
     ApiResponse response = g.fromJson(json, ApiResponse.class);
     return response.data.translations[0].translatedText;

4

먼저 구현 라이브러리 를 선택해야합니다 를 해야합니다.

JSON 처리를위한 자바 API (JSR 353) 변환 생성 파싱하는 휴대용 API를 제공하고, 질의 JSON 객체 모델을 이용하여 API를 스트리밍.

참조 구현은 여기에 있습니다 : https://jsonp.java.net/

다음 은 JSR 353 구현 목록입니다 .

JSR-353 (JSON)을 구현하는 API 란 무엇입니까

그리고 당신이 결정하는 것을 돕기 위해 ... 나는이 기사도 찾았습니다

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

Jackson을 원한다면 Jackson을 사용하여 JSON을 Java로 또는 Java에서 Java로 변환하는 방법에 대한 좋은 기사가 있습니다. 잭슨 /

그것이 도움이되기를 바랍니다!


Jackson 라이브러리의 버전 1을 가리키고 있습니다. 최신 버전의 Jackson 라이브러리를 사용하는 것이 좋습니다.
허버트 유

4

Jayway JsonPath 를 사용할 수 있습니다 . 아래는 소스 코드, pom 세부 정보 및 유용한 문서가 포함 된 GitHub 링크입니다.

https://github.com/jayway/JsonPath

아래 단계를 따르십시오.

1 단계 : Maven을 사용하여 클래스 경로에 jayway JSON 경로 종속성을 추가하거나 JAR 파일을 다운로드하여 수동으로 추가하십시오.

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

2 단계 : 입력 JSON을이 예제의 파일로 저장하십시오. 제 경우에는 JSON을 sampleJson.txt로 저장했습니다. pageInfo와 게시물 사이에 쉼표가 누락되었습니다.

3 단계 : bufferedReader를 사용하여 위 파일에서 JSON 컨텐츠를 읽고 문자열로 저장하십시오.

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 단계 : jayway 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

3

나는 이와 같은 JSON을 가지고있다 :

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

자바 클래스

class PageInfo {

    private String pageName;
    private String pagePic;

    // Getters and setters
}

이 JSON을 Java 클래스로 변환하기위한 코드입니다.

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

메이븐

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

2

하나는 사용할 수 아파치 @Model 주석을 작성하는 자바 의 구조를 나타내는 모델 클래스 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()
    );
})

그게 다야! 그 외에도 비동기 네트워크 통신과 함께 유사한 예를 보여주는 라이브 요지 가 있습니다.


2

jsoniter(jsoniterator)는 비교적 새롭고 간단한 json 라이브러리이며 간단하고 빠르도록 설계되었습니다. JSON 데이터를 직렬화 해제하기 위해해야 ​​할 일은

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

여기서 jsonDatajson 데이터 문자열입니다.

자세한 내용 은 공식 웹 사이트 를 확인하십시오.


1

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));
  }
}

2
이것은 안드로이드 전용입니다
Ľubomír


1
@DermotCanniffe 그것은 단지 안드로이드입니다.
user4020527

1

복잡한 json 및 XML 문서를 구문 분석 하기 위해 DSM 스트림 구문 분석 라이브러리를 사용할 수 있습니다 . DSM은 데이터를 한 번만 구문 분석하고 모든 데이터를 메모리에로드하지 않습니다.

페이지 가 있다고 가정 해 봅시다.주어진 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");

페이지 변수가 json으로 직렬화되었습니다.

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

DSM은 복잡한 json 및 xml에 매우 좋습니다.


0

JsonNodeJSON 문자열의 구조화 된 트리 표현에 사용할 수 있습니다 . 그것은 전적으로 존재하는 견고한 잭슨 라이브러리 의 일부입니다 .

ObjectMapper mapper = new ObjectMapper();
JsonNode yourObj = mapper.readTree("{\"k\":\"v\"}");
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.