2011-03-18 2 views
1

내가Jackson Streaming API를 사용하여 <Integer, Custom object> 맵을 직렬화하는 방법은 무엇입니까?

 class Person { 
     ArrayList<MyOtherObject> lstObjects; 
... 
     } 

다음

Map<Integer, Person> personMap 

있어 잭슨 스트리밍 API와 그지도를 직렬화 할 것 말해봐?

JsonGenerator g =...; 

g.writeArrayFieldStart("PersonMap"); 

    if (personMap != null) { 
      Iterator<Map.Entry<Integer, Person>> iter = personMap.entrySet().iterator(); 
      while (iter.hasNext()) { 

       Map.Entry<Integer, Person> pairs = iter.next(); 
       Integer key = (Integer) pairs.getKey(); 
       Person person = (Person) pairs.getValue(); 
       g.writeNumber(key.intValue()); 

       person.saveToFileRaw(g); // Write the object 

      } 
     } 
     g.writeEndArray(); // PersonMap 

및 person.saveToFileRaw

try { 
      g.writeStartObject(); 

      g.writeObjectFieldStart("Inf"); 
      if (lstInfo != null) { 
       for (PersonInfo info: lstInfo) 
        info.saveToFileRaw(g); // Write another object 
      } 
      g.writeEndObject(); 

      String s = PersonType.token(type); 
      g.writeStringField("Tp", s); 
      g.writeStringField("Add", address); 

그래서 질문과 같습니다 어떻게 사용자 정의 객체의 배열 /지도를 작성하려면? person.saveToFileRaw의 g.writeStartObject()는 값을 예상한다는 예외를 던집니다.

아이디어가 있습니까?

+0

작성하려는 JSON 구조는 무엇입니까? 코드에서 명확하지 않습니다 – skaffman

+0

' 그냥 파일을 어떻게 든 저장하려면 노력하고 있지만 키/개체 또는 이와 비슷한 배열을 만들려고했다 .PersonMap : 의사 코드의 {[키, 사람], [키, 사람]} – Marcus

+1

그냥 객체를 파일에 저장하고 싶다면 Streaming API를 사용할 필요가 없습니다 : ObjectMapper를 통한 데이터 바인딩은 잘 작동합니다 : new ObjectMapper(). writeValue (new File ("output.json"), myObject); – StaxMan

답변

1

JsonGenerator 호출에서 예외가 발생하면 잘못된 JSON 구조를 만들려고합니다. 파싱 ​​할 수없는 것.

코드에서 볼 수있는 한 가지 문제는 "g.writeObjectFieldStart ("Inf ")"를 먼저 호출하고 루프에서 "g.writeStartObject"로 시작하는 메서드를 호출하려고한다는 것입니다. 오브젝트 마커 "{"가 두 번 나타납니다.

아마도 "writeFieldName"을 writeObjectFieldStart() 대신 별도로 호출 할 수도 있습니다. 아니면 PersonInfo 항목에 대해 writeStartArray (writeEndArray()를 수행해야 할 필요가 있습니다.) 정확한 결과물에 따라 달라집니다.

관련 문제