2012-06-19 23 views
5

Id muốn đại diện cho đối tượng Lớp dưới dạng JSON. Ví dụ, nếu tôi có defintions lớp như sau:Làm cách nào để trình bày JSON của một lớp Java?

public class MyClass { 
    String myName; 
    int myAge; 
    MyOtherClass other; 
} 

public class MyOtherClass { 
    double myDouble; 
} 

Tôi muốn để có được lồng nhau JSON sau đây từ một đối tượng Class kiểu MyClass:

{ 
    myName: String, 
    myAge: int, 
    other: { 
     myDouble: double; 
    } 
} 

EDIT:

Tôi không muốn serialize các trường hợp của các lớp này, tôi hiểu làm thế nào để làm điều đó với GSON. Tôi muốn tuần tự hóa cấu trúc của lớp, do đó, cho một lớp đối tượng độc quyền, tôi có thể tạo JSON phân tách các trường của lớp đệ quy thành các đối tượng chuẩn như String, Double, v.v.

Trả lời

1

Tôi khuyên bạn nên sử dụng Jackson. Bạn cũng có thể xem lớp JSonObjectSerializer dựa trên Jackson có thể được tìm thấy tại oVirt dưới động cơ/backend/manager/module/utils (bạn có thể git sao chép mã) và xem cách chúng tôi sử dụng Jackson ở đó.

+0

Vấn đề với tất cả những điều này là tôi không thể có được loại trường, mà đối với tôi là phần quan trọng nhất. –

+1

@hatboysam - Jackson cho phép bạn tuần tự hóa/deserialize cũng loại trường. Xem công việc chúng tôi đã làm tại www.ovirt.org (lấy mã, nhìn vào động cơ/backend/quản lý/modules/utils - bạn sẽ thấy một số mã chúng tôi đã viết cho JSon serializing và deserializing). –

3

Với Jettison, bạn có thể cuộn ánh xạ của riêng bạn từ Java sang JSON. Vì vậy, trong trường hợp này, bạn có thể lấy đối tượng Class của lớp mà bạn muốn, sau đó ánh xạ Java trả về bởi các phương thức getFields, getConstructors, getMethods, vv sang JSON bằng cách sử dụng Jettison.

0

Tìm cách làm điều tương tự, cuối cùng tôi sẽ tự viết phương pháp của riêng mình, điều này không xử lý tất cả các trường hợp, ví dụ: nếu một trong các trường được khai báo là Bản đồ này sẽ bị hỏng, nhưng điều này có vẻ không sao đối với các đối tượng phổ biến nhất:

@Override 
public Map reflectModelAsMap(Class classType) { 
    List<Class> mappedTracker = new LinkedList<Class>(); 

    return reflectModelAsMap(classType, mappedTracker); 
} 

private Map reflectModelAsMap(Class classType, List mappedTracker) { 
    Map<String, Object> mapModel = new LinkedHashMap<String, Object>(); 

    mappedTracker.add(classType); 

    Field[] fields = classType.getDeclaredFields(); 

    for (Field field : fields) { 
     if (mappedTracker.contains(field.getType())) 
      continue; 

     if (BeanUtils.isSimpleValueType(field.getType())) { 
      mapModel.put(field.getName(), field.getType().toString()); 
     } else if (Collection.class.isAssignableFrom(field.getType())) { 
      Class actualType = (Class) ((ParameterizedType) field.getGenericType()).getActualTypeArguments()[0]; 
      mapModel.put("Collection", reflectModelAsMap(actualType, mappedTracker)); 
     } else { 
      mapModel.put(field.getName(), reflectModelAsMap(field.getType(), mappedTracker)); 
     } 
    } 

    return mapModel; 
} 

Trình theo dõi được ánh xạ đó vì cách tôi xử lý các mối quan hệ trong Hibernate; không có nó có một mối quan hệ đệ quy vô tận giữa cha mẹ và con cái, ví dụ như child.getFather().getFirstChild().getFather().getFirstChild().getFather()...

Các vấn đề liên quan