2012-11-22 30 views
34

Tôi muốn sử dụng jackson để chuyển đổi một ArrayList thành một JsonArray.Jackson - cách tốt nhất để viết một danh sách java vào một mảng json

Event.java: đây là lớp bean java có hai trường "field1", "field2" được ánh xạ dưới dạng JsonProperty.

Mục tiêu của tôi là:

Chuyển đổi

ArrayList<Event> list = new ArrayList<Event>(); 
    list.add(new Event("a1","a2")); 
    list.add(new Event("b1","b2")); 

Để

[ 
{"field1":"a1", "field":"a2"}, 
{"field1":"b1", "field":"b2"} 
] 

Con đường tôi có thể nghĩ đến là: writeListToJsonArray():

public void writeListToJsonArray() throws IOException { 
    ArrayList<Event> list = new ArrayList<Event>(); 
    list.add(new Event("a1","a2")); 
    list.add(new Event("b1","b2")); 

    OutputStream out = new ByteArrayOutputStream(); 

    JsonFactory jfactory = new JsonFactory(); 
    JsonGenerator jGenerator = jfactory.createJsonGenerator(out, JsonEncoding.UTF8); 
    ObjectMapper mapper = new ObjectMapper(); 
    jGenerator.writeStartArray(); // [ 

    for (Event event : list) { 
     String e = mapper.writeValueAsString(event); 
     jGenerator.writeRaw(usage); 
     // here, big hassles to write a comma to separate json objects, when the last object in the list is reached, no comma 
    } 

    jGenerator.writeEndArray(); // ] 

    jGenerator.close(); 

    System.out.println(out.toString()); 
} 

Tôi đang tìm kiếm một cái gì đó như:

generator.write(out, list) 

này trực tiếp chuyển đổi các danh sách sang định dạng mảng json và sau đó ghi nó vào OutputStream "out".

thậm chí tham lam hơn:

generator.write(out, list1) 

generator.write(out, list2) 

này sẽ chỉ chuyển đổi/thêm trong list1, List2 thành một mảng json duy nhất. sau đó viết nó vào "out"

+2

Bạn đã thử 'mapper.writeValueAsString (list)'? Hoặc 'mapper.writeValue (out, list)'. –

+0

vâng, ở cuối mapper.writeValueAsString (danh sách) làm các trick, nhưng trường hợp của tôi là muốn viết nhiều danh sách trở lại trở lại vào một JsonArray duy nhất. Bất kỳ ý tưởng? – Shengjie

+0

Nếu tôi hiểu chính xác bạn, bạn có thể tạo danh sách mới và thêm tất cả danh sách vào danh sách mới và chuyển đổi thành json. –

Trả lời

37

Điều này quá phức tạp, Jackson xử lý danh sách thông qua các phương thức ghi cũng như xử lý các đối tượng thông thường. Điều này sẽ chỉ làm việc tốt cho bạn, giả sử tôi đã không hiểu lầm câu hỏi của bạn:

public void writeListToJsonArray() throws IOException { 
    final List<Event> list = new ArrayList<Event>(2); 
    list.add(new Event("a1","a2")); 
    list.add(new Event("b1","b2")); 

    final ByteArrayOutputStream out = new ByteArrayOutputStream(); 
    final ObjectMapper mapper = new ObjectMapper(); 

    mapper.writeValue(out, list); 

    final byte[] data = out.toByteArray(); 
    System.out.println(new String(data)); 
} 
+0

có, điều này hoạt động, cảm ơn :) Tôi đoán vấn đề của tôi là nhiều lúc thêm nhiều danh sách vào một jsonArray duy nhất, mapper.writeValue (ra, list1) mapper.writeValue (ra, list2) .... mapper.writeValue (ra, listn) là viết danh sách như mảng json riêng biệt, bạn nhận được quan điểm của tôi? Về cơ bản tôi có danh sách gửi đến, tôi muốn thêm chúng vào một jsonarray duy nhất. – Shengjie

+2

Bạn không thể ghi nhiều danh sách ngược lại mà không bị gắn nhãn là thuộc tính, đó sẽ không phải là JSON hợp lệ. – Perception

+0

bạn có thể viết nhiều mảng ra nếu chúng được bọc trong một mảng –

18

tôi không thể tìm toByteArray() như @atrioom nói, vì vậy tôi sử dụng StringWriter, hãy thử:

public void writeListToJsonArray() throws IOException { 

    //your list 
    final List<Event> list = new ArrayList<Event>(2); 
    list.add(new Event("a1","a2")); 
    list.add(new Event("b1","b2")); 


    final StringWriter sw =new StringWriter(); 
    final ObjectMapper mapper = new ObjectMapper(); 
    mapper.writeValue(sw, list); 
    System.out.println(sw.toString());//use toString() to convert to JSON 

    sw.close(); 
} 

Hoặc chỉ cần sử dụng ObjectMapper#writeValueAsString:

final ObjectMapper mapper = new ObjectMapper(); 
    System.out.println(mapper.writeValueAsString(list)); 
7

Trong đối tượngMapper chúng tôi có writeValueAsString() chấp nhận đối tượng làm tham số. Chúng ta có thể truyền danh sách đối tượng khi tham số lấy lại chuỗi.

List<Apartment> aptList = new ArrayList<Apartment>(); 
    Apartment aptmt = null; 
    for(int i=0;i<5;i++){ 
     aptmt= new Apartment(); 
     aptmt.setAptName("Apartment Name : ArrowHead Ranch"); 
     aptmt.setAptNum("3153"+i); 
     aptmt.setPhase((i+1)); 
     aptmt.setFloorLevel(i+2); 
     aptList.add(aptmt); 
    } 
mapper.writeValueAsString(aptList) 
Các vấn đề liên quan