JSON에서 Java 클래스를 생성 하시겠습니까?


215

Java Maven 프로젝트에서 JSON에서 Java 소스 파일을 어떻게 생성합니까? 예를 들어 우리는

{
  "firstName": "John",  
  "lastName": "Smith",  
  "address": {  
    "streetAddress": "21 2nd Street",  
     "city": "New York"
  }
}

우리가 실행할 때 mvn generate-sources다음과 같은 것을 생성하기를 원합니다.

class Address  {
    JSONObject mInternalJSONObject;

    Address (JSONObject json){
        mInternalJSONObject = json;
    }

    String  getStreetAddress () {
        return mInternalJSONObject.getString("streetAddress");
    }

    String  getCity (){
        return mInternalJSONObject.getString("city");
    }
}

class Person {        
    JSONObject mInternalJSONObject;

    Person (JSONObject json){
        mInternalJSONObject = json;
    }

    String  getFirstName () {
        return mInternalJSONObject.getString("firstName");
    }

    String  getLastName (){
        return mInternalJSONObject.getString("lastName");
    }

    Address getAddress (){
        return Address(mInternalJSONObject.getString("address"));
    }
}

Java 개발자로서,이를 위해 어떤 XML 라인을 작성해야 pom.xml합니까?


질문과 답변을 주제별로 업데이트했습니다. 다시여십시오.
Alex R

답변:


269

jsonschema2pojo 플러그인을 사용해보십시오 .

        <plugin>
            <groupId>org.jsonschema2pojo</groupId>
            <artifactId>jsonschema2pojo-maven-plugin</artifactId>
            <version>1.0.2</version>
            <configuration>
                <sourceDirectory>${basedir}/src/main/resources/schemas</sourceDirectory>
                <targetPackage>com.myproject.jsonschemas</targetPackage>
                <sourceType>json</sourceType>
            </configuration>
            <executions>
                <execution>
                    <goals>
                        <goal>generate</goal>
                    </goals>
                </execution>
            </executions>
        </plugin>

<sourceType>json</sourceType>커버 소스가 (영업 이익 등) JSON 인 경우. 실제 json 스키마가있는 경우이 행을 제거하십시오.

이 질문을 받았을 때 '09 년 12 월 이후 두 가지 일이 발생했습니다.

  • JSON 스키마 사양은 많은에 이동했습니다. 아직 초안이지만 아직 완성되지 않았으며 이제는 구조 규칙을 지정하는 실행 가능한 도구입니다.

  • 최근에 문제를 해결하기 위해 특별히 고안된 새로운 오픈 소스 프로젝트 인 jsonschema2pojo를 시작했습니다 . jsonschema2pojo 도구는 json 스키마 문서를 가져와 DTO 스타일 Java 클래스 (.java 소스 파일 형식)를 생성합니다. 이 프로젝트는 아직 성숙하지는 않았지만 이미 json 스키마의 가장 유용한 부분을 다루고 있습니다. 개발을 추진하는 데 도움이되는 사용자의 의견을 더 찾고 있습니다. 지금 명령 행에서 또는 Maven 플러그인으로 도구를 사용할 수 있습니다.

도움이 되었기를 바랍니다!


4
jsonschema2pojo 도구를 사용한 사람이 자신의 스키마 파일을 작성하지 않아도됩니까? OP는 스키마가 아닌 Json 파일로 시작하도록 요청했습니다. Json-> Schema에서 가져갈 수있는 동반자 도구가 있습니까? 나는 그러한 도구가 존재한다면 추측 만 제공 할 수 있다고 가정한다.
Jeff Axelrod

3
버전 0.3.3의, 당신은 : 입력으로 평범한 구식 JSON 사용할 수 있습니다
joelittlejohn

14
... 그리고 이제 온라인 발전기도 있습니다 : jsonschema2pojo.org
joelittlejohn

2
훌륭한 도구입니다. 제공된 링크에는 샘플 JSON에 붙여넣고 단추를 클릭하고 Java 소스를 가져올 수있는 온라인 도구가 포함되어 있습니다.
mbmast

1
@testerjoe Java 소스 코드를 의미한다면, jsonschema2pojo가 이것을 수행하며, maven 플러그인, 개미 작업, gradle 확장, CLI 도구, Java 라이브러리 등으로 사용할 수 있습니다.
joelittlejohn

21

Jackson (가장 인기있는 라이브러리)을 사용하는 경우 시도하십시오

https://github.com/astav/JsonToJava

공개 소스와 누구나 기여할 수 있어야합니다.

요약

제공된 샘플 json 데이터를 기반으로 스키마를 추론하고 필요한 Java 데이터 구조를 생성하는 JsonToJava 소스 클래스 파일 생성기

실제 코드를 작성하기 전에 팀이 Json을 먼저 생각하도록 권장합니다.

풍모

  • 임의로 복잡한 계층 구조에 대한 클래스를 생성 할 수 있습니다 (재귀 적으로).
  • 기존 Java 클래스를 읽을 수 있으며 해당 구조로 직렬화 해제 할 수있는 경우
  • 모호한 사례가 존재하면 사용자 입력을 요구합니다

13

중첩 된 객체 또는 중첩 된 객체 배열을 포함하여 JSON을 사용하고 Jackson 주석이있는 Java 소스를 생성 하는 온라인 도구 가 있습니다.


1
이것은 처음 나에게 매우 효과적이었습니다. JSON을 깊게 중첩했으며 전체 크기가 2k 미만이되도록 중복 부분을 잘라야했지만 잘 작동했습니다. 내가 쓸 수있게 : MyClass c = new MyClass (); c = gson.fromJson (c.getHTML (someURLthatReturnsJSON), MyClass.class); 결과 데이터가 완벽하게 흐릅니다. 잭슨 표기법을 모두 제거해야했지만 그렇지 않으면 gson에 잘 작동했습니다. 감사합니다.
noogrub

고마워요. 대소 문자를 구분하는 필드가있는 JSON에 피드를 제공했을 때이 사이트는 결과를 반환했지만 www.jsonschema2pojo.org에서 오류를보고했습니다.
CoolMind

6

최근 프로젝트 로이 오래된 질문에 대답 ;-).

현재 가장 좋은 해결책은 아마도 JsonSchema2Pojo입니다 .

Json Schema는 거의 사용하지 않았지만 일반 Json에서도 거의 사용하지 않습니다. Ant 및 Maven 플러그인과 온라인 테스트 애플리케이션을 제공합니다. 은 도구에 대한 아이디어를 제공 할 수 있습니다. Json Tweet을 넣고 모든 포함 클래스 (Tweet, User, Location 등)를 생성했습니다.

우리는 Agorava 프로젝트에서 소셜 미디어 매핑을 생성하고 API의 지속적인 진화를 따라갈 것입니다.


그것은 또한 나의 인상이지만, Maven 플러그인을 아직 시도하지는 않았지만 온라인 버전은 꽤 느리고 일반적인 Person 클래스 이외의 다른 것으로 인해 죽습니다 ... 빠른 온라인 변환을 위해 @ tim-boudreau의 도구가 나를.
Gregor

JsonSchema2Pojo를 시도했지만 미리보기 버튼을 누르면 빈 미리보기가 나타납니다.
AndroidDev

5

도와 주신 모든 분들께 감사드립니다.
나에게이 스크립트는 도움이되었다. 플랫 JSON 만 처리하고 유형을 처리하지 않지만 일부 루틴을 자동화합니다.

  String str = 
        "{"
            + "'title': 'Computing and Information systems',"
            + "'id' : 1,"
            + "'children' : 'true',"
            + "'groups' : [{"
                + "'title' : 'Level one CIS',"
                + "'id' : 2,"
                + "'children' : 'true',"
                + "'groups' : [{"
                    + "'title' : 'Intro To Computing and Internet',"
                    + "'id' : 3,"
                    + "'children': 'false',"
                    + "'groups':[]"
                + "}]" 
            + "}]"
        + "}";



    JSONObject json = new JSONObject(str);
    Iterator<String> iterator =  json.keys();

    System.out.println("Fields:");
    while (iterator.hasNext() ){
       System.out.println(String.format("public String %s;", iterator.next()));
    }

    System.out.println("public void Parse (String str){");
    System.out.println("JSONObject json = new JSONObject(str);");

    iterator  = json.keys();
    while (iterator.hasNext() ){
       String key = iterator.next();
       System.out.println(String.format("this.%s = json.getString(\"%s\");",key,key ));

    System.out.println("}");

5

나는 이것이 오래된 질문이라는 것을 알고 있지만, 스스로 답을 찾으려고 시도하면서 넘어졌습니다.

온라인 json-pojo 생성기 (jsongen)를 언급하는 대답은 좋지만 명령 줄에서 실행할 수 있고 더 조정할 수있는 것이 필요했습니다.

그래서 샘플 JSON 파일을 가져 와서 POJO를 생성하는 매우 해킹 된 루비 스크립트를 작성했습니다. Java 예약 키워드와 일치하는 필드를 처리하지 않는 등 여러 가지 제한 사항이 있지만 많은 경우 충분합니다.

기본적으로 생성 된 코드는 Jackson과 함께 사용하기 위해 주석을 달지만 스위치를 사용하여 끌 수 있습니다.

github에서 코드를 찾을 수 있습니다 : https://github.com/wotifgroup/json2pojo


2

내가 아는 한 그러한 도구는 없습니다. 아직.

주된 이유는 XML과는 달리 (XML 스키마와 XML과 POJO 정의 사이에 요청하는 것을 수행하는 'xjc'와 같은 도구)와 달리 스키마 언어가 완전히 기능하지 않기 때문입니다. JSON 스키마는 있지만 실제 유형 정의 (JSON 구조에 중점)를 거의 지원하지 않으므로 Java 클래스를 생성하기가 까다로울 수 있습니다. 그러나 아마도 여전히 가능합니다. 일부 명명 규칙이 정의되어 생성을 지원하는 데 사용되는 경우

그러나 이것은 상당히 자주 요청되는 것입니다 (필요한 JSON 도구 프로젝트의 메일 링리스트에서). 누군가가 가까운 장래에 그러한 도구를 작성할 것이라고 생각합니다.

그래서 나는 그것이 그 자체로 나쁜 생각이라고 생각하지 않습니다 (또한 : 모든 사용 사례에 대해 좋은 생각은 아니며, 당신이하고 싶은 것에 달려 있습니다).



2

GSON 라이브러리를 사용해 볼 수도 있습니다. 컬렉션, 사용자 지정 개체에서 JSON을 만들 수 있으며 그 반대도 가능합니다. Apache License 2.0에 따라 출시되었으므로 상업적으로도 사용할 수 있습니다.

http://code.google.com/p/google-gson/


13
자바 정의를 만들지 않습니다
necromancer

3
이것은 문제가 아닙니다


0

@japher의 게시물에 추가합니다. 특히 JSON에 묶여 있지 않은 경우 프로토콜 버퍼 를 체크 아웃 할 가치가 있습니다.


1
프로토콜 버퍼는 JSON에서 Java 객체를 만드는 방법에 대한 답변에 가깝지 않습니다. 최소한 프로토콜 버퍼에서 Java 오브젝트를 작성하기위한 도구를 권장해야합니다.
james.garriss

0

내 솔루션을 사용해보십시오

http://htmlpreview.github.io/?https://raw.githubusercontent.com/foobnix/android-universal-utils/master/json/generator.html

{
    "auctionHouse": "sample string 1",
    "bidDate": "2014-05-30T08:20:38.5426521-04:00 ",
    "bidPrice": 3,
    "bidPrice1": 3.1,
    "isYear":true
}

결과 자바 클래스

private String  auctionHouse;
private Date  bidDate;
private int  bidPrice;
private double  bidPrice1;
private boolean  isYear;

JSONObject get

auctionHouse = obj.getString("auctionHouse");
bidDate = obj.opt("bidDate");
bidPrice = obj.getInt("bidPrice");
bidPrice1 = obj.getDouble("bidPrice1");
isYear = obj.getBoolean("isYear");

JSONObject 풋

obj.put("auctionHouse",auctionHouse);
obj.put("bidDate",bidDate);
obj.put("bidPrice",bidPrice);
obj.put("bidPrice1",bidPrice1);
obj.put("isYear",isYear);

이 대답은 너무 사소 해 보입니다. json에서 pojo를 생성하는 자동 방법이 있습니다
Rafael Ruiz Tabares

0

도구를 개발하는 방법을 보여 드리겠습니다.

  1. 사용자 자바 스크립트 함수 Json.parse (), 문자열을 JSON과 같은 JSON 객체로 변환하십시오.
  2. 그런 다음이 객체를 사용하여 javabean 형식을 생성하십시오.
  3. (1) 문자열을 알아내는 방법과 같은 값 유형 매핑은 날짜 유형입니다. (2) loweser_case to camelCase

나는 문제를 해결하는 도구를 개발한다. 내 github 에서 코드를 가져옵니다 .

여기서 즐기십시오 . 웹 서버에 배포했습니다 .

하나의 웹은 열 수 없습니다. 하나는 내 도구보다 느립니다. 내 도구를 즐기십시오.


이 링크가 질문에 대답 할 수 있지만 여기에 답변의 필수 부분을 포함시키고 참조 할 수있는 링크를 제공하는 것이 좋습니다. 링크 된 페이지가 변경되면 링크 전용 답변이 유효하지 않을 수 있습니다.
크롬
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.