2011-03-14 2 views
0

GSON을 사용하여 일부 JSON 파일을 비 직렬화합니다. 다음은 필자가 작성한 비 직렬화 방법입니다. JSON 파일을 읽고 전체를이 메서드에 전달하는 문자열로 저장합니다. 이 방법은이 프로젝트와 관련된 5 개의 JSON 파일 중 4 개에서 성공적으로 작동합니다.GSON을 사용하는 JSON 비 직렬화는 해시 맵에서 해시 맵의 데이터 멤버를 건너 뜁니다.

protected ArrayList<Entry> deserialize(String json) throws Exception 
{ 
    ArrayList<Entry> list = new ArrayList<Entry>(); 


    JsonParser parser = new JsonParser(); 

    JsonArray jarray = (JsonArray) parser.parse(json); 

    for (int i = 0; i < jarray.size(); i++) 
    { 

     // Parse out the brand 
     JsonObject jentry = (JsonObject) jarray.get(i); 

     JsonPrimitive jbrand = jentry.getAsJsonPrimitive("brand"); 

     String className = jbrand.getAsString(); 

     Entry entry = (Entry) gson.fromJson(jentry, Class.forName(className)); 

     list.add(entry); 
    } 

    return list; 
} 

가 여기 구문 분석하고 문자열에 넣어 JSON 파일의 존재 'jentry'에 결합 얻을 여러 개체를 있어요하지만 난 그냥 하나를 포함합니다. 그것이 이상하게 보일 경우 FireFox 플러그인을 사용하여 JSON 파일을 보았고 해당 플러그인에서 복사/붙여 넣기했기 때문일 수 있습니다.

[ 

* 
    - 
    { 
     o pattern: "3 5 * * 1-5" 
     o starts: 1288249260913 
     o ends: 1291125660913 
     o skipHolidays: false 
     o lastFired: 1289988180395 
     o 
     - 
     template: { 
      + location: "" 
      + damageCause: "" 
      + signed: false 
      + signedBy: "" 
      + approvedBy: "Ralph" 
      + requestedBy: "Ralph" 
      + estHours: 0 
      + actHours: 0 
      + chargeTo: "" 
      + priority: "ROUTINE" 
      + reason: "" 
      + materials: "" 
      + serviceId: 1 
      + descr: "HELP WITH LEAVES,BLOW LEAVES IN YOUR AREA NEAR DRAINS Check for garbage. [sp] Mow and weedeat where needed in your area. [sp] Work on leaves where needed. [wi]" 
      + comments: [ ] 
      + futureId: 3 
      + inventoryId: -1 
      + 
       - 
       trail: [ 
        # 
        - 
        { 
         * stamp: 1288026816857 
         * status: "OPEN" 
         * byId: 2 
        } 
        # 
        - 
        { 
         * stamp: 1288026889374 
         * status: "DISPATCHED" 
         * byId: 2 
        } 
        # 
        - 
        { 
         * stamp: 1288194095170 
         * status: "DISPATCHED" 
         * byId: 2 
        } 
        # 
        - 
        { 
         * stamp: 1288287964481 
         * status: "DISPATCHED" 
         * byId: 2 
        } 
        # 
        - 
        { 
         * stamp: 1288785076532 
         * status: "DISPATCHED" 
         * byId: 2 
        } 
        # 
        - 
        { 
         * stamp: 1288797119525 
         * status: "DISPATCHED" 
         * byId: 2 
        } 
        # 
        - 
        { 
         * stamp: 1289307416921 
         * status: "DISPATCHED" 
         * byId: 2 
        } 
        # 
        - 
        { 
         * stamp: 1289308339165 
         * status: "DISPATCHED" 
         * byId: 2 
        } 
        # 
        - 
        { 
         * stamp: 1289834523635 
         * status: "DISPATCHED" 
         * byId: 2 
        } 
        # 
        - 
        { 
         * stamp: 1289847660913 
         * status: "DISPATCHED" 
         * byId: 2 
        } 
       ] 
      + requestDate: 1289329260913 
      + assignedDate: 1288029660912 
      + supplies: [ ] 
      + id: 3 
      + updateDate: 1289847660913 
      + createUserId: 2 
      + updateUserId: 2 
      + createDate: 1288026816857 
      + brand: "org.workplicity.marist.grounds.GroundsRequest" 
     } 
     o workSlateId: 16 
     o serviceId: 1 
     o enabled: false 
     o id: 3 
     o updateDate: 1291235385719 
     o createUserId: 2 
     o updateUserId: 2 
     o createDate: 1288026889373 
     o brand: "org.workplicity.entry.event.Weekdays" 
    } 

문제는 GSON이 JSON (직렬화?)으로 되돌아 가면 일부 필드가 누락된다는 것입니다. 결과는 다음과 같습니다. 관련 누락 된 줄은 'template :'아래와 'serviceID :'아래의 모든 항목입니다. 전체 개체를 다시 포함합니다.

[ 

* 
    - 
    { 
     o pattern: "3 5 * * 1-5" 
     o starts: 1288249260913 
     o ends: 1291125660913 
     o skipHolidays: false 
     o lastFired: 1289988180395 
     o 
     - 
     template: { 
      + serviceId: 1 
      + descr: "HELP WITH LEAVES,BLOW LEAVES IN YOUR AREA NEAR DRAINS Check for garbage. [sp] Mow and weedeat where needed in your area. [sp] Work on leaves where needed. [wi]" 
      + comments: [ ] 
      + futureId: 3 
      + inventoryId: -1 
      + 
       - 
       trail: [ 
        # 
        - 
        { 
         * stamp: 1288026816857 
         * status: "OPEN" 
         * byId: 2 
        } 
        # 
        - 
        { 
         * stamp: 1288026889374 
         * status: "DISPATCHED" 
         * byId: 2 
        } 
        # 
        - 
        { 
         * stamp: 1288194095170 
         * status: "DISPATCHED" 
         * byId: 2 
        } 
        # 
        - 
        { 
         * stamp: 1288287964481 
         * status: "DISPATCHED" 
         * byId: 2 
        } 
        # 
        - 
        { 
         * stamp: 1288785076532 
         * status: "DISPATCHED" 
         * byId: 2 
        } 
        # 
        - 
        { 
         * stamp: 1288797119525 
         * status: "DISPATCHED" 
         * byId: 2 
        } 
        # 
        - 
        { 
         * stamp: 1289307416921 
         * status: "DISPATCHED" 
         * byId: 2 
        } 
        # 
        - 
        { 
         * stamp: 1289308339165 
         * status: "DISPATCHED" 
         * byId: 2 
        } 
        # 
        - 
        { 
         * stamp: 1289834523635 
         * status: "DISPATCHED" 
         * byId: 2 
        } 
        # 
        - 
        { 
         * stamp: 1289847660913 
         * status: "DISPATCHED" 
         * byId: 2 
        } 
       ] 
      + requestDate: 1289329260913 
      + assignedDate: 1288029660912 
      + supplies: [ ] 
      + id: 3 
      + updateDate: 1289847660913 
      + createUserId: 2 
      + updateUserId: 2 
      + createDate: 1288026816857 
      + brand: "org.workplicity.marist.grounds.GroundsRequest" 
     } 
     o workSlateId: 16 
     o serviceId: 1 
     o enabled: false 
     o id: 3 
     o updateDate: 1299694066807 
     o createUserId: 2 
     o updateUserId: 2 
     o createDate: 1288026889373 
     o brand: "org.workplicity.entry.event.Weekdays" 
    } 

이는 JSON 파일의 모든 개체에 대해 발생합니다. NetBeans에서 디버깅을하면 JsonObject 'jentry'에 JSON 문자열의 각 데이터 멤버에 해당하는 키 값 쌍이있는 해시 테이블이 있다는 사실이 밝혀졌습니다. '템플릿'은이 해시 테이블 내에서 해시 테이블로 저장됩니다.이 해시 테이블은 문제가 될 수도 있고 아닐 수도 있습니다. 솔직히 알아낼 수 없었습니다. 아니 -

Entry entry = (Entry) gson.fromJson(jentry, Class.forName(className)); 

이 문제는이 특정 JSON 파일과 관련된 특정 클래스가 가지고 있지 않은 것이 었습니다 : 내가 처음에 문제 JSON 파일에이 방법을 실행했을 때

지금은이 라인에서 예외를 얻었다 인수 생성자는 그래서 너무처럼 GSON 빌더 일부 InstanceCreators을 등록했다 :

gsonBuilder.registerTypeAdapter(Weekdays.class, new WeekdaysInstanceCreator()); 
gsonBuilder.registerTypeAdapter(Once.class, new OnceInstanceCreator()); 

나는 예외가 발생하고 모든 일 것으로 보인다 뺀 물론 누락 된 필드되고 멈춘있었습니다.

그것이 내가있는 곳입니다. 나는 무엇이 잘못 될지를 놓치고 있습니다. 전혀 도움이된다면 크게 감사하겠습니다.

답변

2

Gson이 JSON에있는 필드를 삭제하면 일반적으로 사용자가 직렬화 할 클래스가 해당 필드를 정의하지 않기 때문에 발생합니다. 기본 클래스 유형으로 역 직렬화하는 경우이 문제가 발생할 수 있습니다. org.workplicity.marist.grounds.GroundRequest에 참조하는 필드가 포함되어 있는지 확인할 수 있습니까?

0

Gson 1.7의 최신 버전을 다운로드하십시오. 그것은 당신을 도울 수있는 많은 새로운 기능을 포함하고 있습니다. http://groups.google.com/group/google-gson/browse_thread/thread/6272c9be58676e47#을 참조하십시오.

Gson이 기본 생성자 또는 인스턴스 작성자를 사용하지 않고 클래스 인스턴스에 자동으로 힙 공간을 할당 할 수 있으므로 인스턴스 작성자는 더 이상 필요하지 않습니다.

기본적으로 Gson은 필드를 건너 뛰는 경우 "정적", "일시적인"또는 "내부 클래스"인 경우 필드를 건너 뜁니다.

0

NetBeans에서 디버깅을 수행하면 JsonObject 'jentry'에 JSON 문자열의 각 데이터 멤버에 해당하는 키 값 쌍이있는 해시 테이블이 있음을 알 수 있습니다. '템플릿'은이 해시 테이블 내에서 해시 테이블로 저장됩니다.이 해시 테이블은 문제가 될 수도 있고 아닐 수도 있습니다. 솔직히 알아낼 수 없었습니다.

정상입니다. Gson은 처음에 JSON 객체를 JsonObject으로 읽어들입니다.이 객체 내에서 JSON 요소 이름과 값은 LinkedHashMap에 저장됩니다. 따라서 JSON 구조체가 객체에 객체를 포함하면 초기 구조체 Gson은 JSON을 읽어 들여 LinkedHashMap의 으로 만들고 그 중 하나의 값이 인 다른 JsonObject의 값을 갖습니다.

원래 게시글에는 JsonObjects의지도 내용이 예기치 않게 부족하다고 명시되어 있지 않습니다. 비 직렬화 된 데이터를 직렬화 한 후 일부 내용이 누락되었다고 설명했습니다. 문제를 재현 할 수있는 충분한 정보가 제공되지 않았기 때문에 사람들은 문제가 무엇인지 추측 할 수 있습니다. 그리고 inder의 추측은 무엇이든 좋아 보인다. 나는 Gson의 결점을 지적하는 것을 볼 수 없다.

"GSON을 사용하여 JSON 역 직렬화가 해시 맵에서 해시 맵 내 데이터 멤버를 건너 뜁니다"라는 질문의 특정 문장에 대해서는 질문의 나머지 내용에서 실제로 원래의 질문이 대상 Java 구조는지도 내의지도였습니다. 대상 Java 구조가 맵 내의 맵인 경우 JSON 요소가 Java 필드에 제대로 바인딩되어 있고 GFC가 일부 필드를 건너 뛴다는 시나리오를 재현 할 수없고 Gson issue 325에 대한 처리가 제공됩니다 (커스텀 역 직렬화).

관련 문제