Tôi đang làm việc trên một dự án sử dụng Jersey để chuyển đổi các đối tượng thành JSON. Tôi muốn để có thể viết ra danh sách lồng nhau, như vậy:Làm cách nào để sắp xếp các danh sách lồng nhau dưới dạng JSON bằng Jersey? Tôi nhận được một mảng null hoặc một mảng từ điển một phần tử có chứa một mảng
{"data":[["one", "two", "three"], ["a", "b", "c"]]}
Đối tượng tôi muốn chuyển đổi đầu tiên đại diện cho dữ liệu như một LinkedList < < LinkedList < Chuỗi > > >, và tôi đã tìm Jersey sẽ làm điều đúng đắn. Trên đây là đầu ra như một danh sách các null:
{"data":[null, null]}
Sau khi đọc rằng đối tượng lồng nhau cần phải được bao bọc, tôi thử như sau:
@XmlRootElement(name = "foo")
@XmlType(propOrder = {"data"})
public class Foo
{
private Collection<FooData> data = new LinkedList<FooData>();
@XmlElement(name = "data")
public Collection<FooData> getData()
{
return data;
}
public void addData(Collection data)
{
FooData d = new FooData();
for(Object o: data)
{
d.getData().add(o == null ? (String)o : o.toString());
}
this.data.add(d);
}
@XmlRootElement(name = "FooData")
public static class FooData
{
private Collection<String> data = new LinkedList<String>();
@XmlElement
public Collection<String> getData()
{
return data;
}
}
}
Đó là mã kết quả đầu ra những gì bên dưới, đó là gần gũi hơn với những gì Tôi muốn:
{"data":[{"data":["one", "two", "three"]},{"data":["a", "b", "c"]}]}
Tôi muốn dữ liệu đầu tiên là danh sách các danh sách, không phải danh sách từ điển một phần tử. Làm thế nào để đạt được điều này?
Dưới đây là JAXBContentResolver tôi:
@Provider
public class JAXBContextResolver implements ContextResolver<JAXBContext>
{
private JAXBContext context;
private Set<Class<?>> types;
// Only parent classes are required here. Nested classes are implicit.
protected Class<?>[] classTypes = new Class[] {Foo.class};
protected Set<String> jsonArray = new HashSet<String>(1) {
{
add("data");
}
};
public JAXBContextResolver() throws Exception
{
Map<String, Object> props = new HashMap<String, Object>();
props.put(JSONJAXBContext.JSON_NOTATION, JSONJAXBContext.JSONNotation.MAPPED);
props.put(JSONJAXBContext.JSON_ROOT_UNWRAPPING, Boolean.TRUE);
props.put(JSONJAXBContext.JSON_ARRAYS, jsonArray);
this.types = new HashSet<Class<?>>(Arrays.asList(classTypes));
this.context = new JSONJAXBContext(classTyes, props);
}
public JAXBContext getContext(Class<?> objectType)
{
return (types.contains(objectType)) ? context : null;
}
}
Ok, tôi chỉ đoán trường hợp của bạn phức tạp hơn tôi ... – Arnaudweb