2012-12-10 41 views
2

我想使用Jackson解析器解析JSONList。如果列表包含多個元素,則解析工作正常。在Android中使用Jackson的JSONList解析問題

String json = "{\"students\":[{\"id\":\"1\",\"name\":\"A\"}, {\"id\":\"2\",\"name\":\"B\"}]}"; 

如果只有一個元素,那麼我們將得到一個只包含一個json對象的json。

String json = "{\"students\":{\"id\":\"1\",\"name\":\"A\"}}"; 

當時我收到以下錯誤

12-10 15:49:01.527: W/System.err(18923): org.codehaus.jackson.map.JsonMappingException: Can not deserialize instance of java.util.ArrayList out of START_OBJECT token 

我使用下面的代碼:

@JsonIgnoreProperties(ignoreUnknown = true) 
public class Student { 
    @JsonProperty("id") 
    public String id; 

    @JsonProperty("name") 
    public String name; 
} 

    @JsonIgnoreProperties(ignoreUnknown = true) 
public class StudentList { 
    @JsonProperty("students") 
    ArrayList<Student> students = new ArrayList<Student>(); 
} 


    public class JacksonTest extends Activity { 

    StudentList studentList; 
    //String json = "{\"students\":[{\"id\":\"1\",\"name\":\"A\"}, {\"id\":\"2\",\"name\":\"B\"}]}"; 
    String json = "{\"students\":{\"id\":\"1\",\"name\":\"A\"}}"; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_jackson_test); 


     ObjectMapper objectMapper = new ObjectMapper(); 
     JsonFactory jf = new JsonFactory(); 
     try { 
      JsonParser jp = jf.createJsonParser(json); 
      jp.setFeature(JsonParser.Feature.ALLOW_UNQUOTED_CONTROL_CHARS,true); 
      studentList = objectMapper.readValue(jp, StudentList.class); 

      System.out.println("Size :"+studentList.students.size()); 
     } 
     catch (JsonParseException e) { 
      e.printStackTrace(); 
     } 
     catch (JsonMappingException e) { 
      e.printStackTrace(); 
     } 
     catch (IOException e) { 
      e.printStackTrace(); 
     } 
    } 

} 

請幫我解決這個問題。 其實我想解析包含大量列表的非常大的json。

由於提前, 薩德什乙

回答

2

studentList應包含對象,而不是ArrayList的

public class StudentList { 
    @JsonProperty("students") 
    public Student students; 
} 

我希望這將解決您的問題

+0

感謝您的回覆。我需要使用單個StudentList解析兩個json。你的答案只會解析第二個答案。服務器將根據學生人數發送兩個json。 –

+1

我認爲服務器設計的很糟糕 - 它不應該返回元素或列表,但總是列表如果可能會返回多個條目。不幸的是,這似乎是一個常見的服務器端反模式...這就是爲什麼傑克遜支持它(當然幸運的是!:)) – StaxMan

+0

@StaxMan:不幸的是,服務器的傢伙不會做任何改變。我沒有其他選擇。不管怎樣,謝謝。 –