2013-07-28 35 views
6

Tôi có json như thế này:Jackson JSON phân tích có chứa một mảng các đối tượng và mảng bản đồ w/phím năng động

{ 

    "users":{ 
      "1234":{ 
       "firstname":"Joe", 
       "lastname":"Smith" 
      }, 
      "9876":{ 
       "firstname":"Bob", 
       "lastname":"Anderson" 
      } 
    }, 
    "jobs":[ 
      { 
       "id":"abc", 
       "location":"store" 
      }, 
      { 
       "id":"def", 
       "location":"factory" 
      } 
    ] 
} 

Tôi đang phân tích cú pháp này sử dụng Jackson và vì vậy tôi đã được phân tích cú pháp phản ứng sử dụng: readvalue (json, MyCustomClass.class)

đâu MyCustomClass trông giống như

public class MyCustomClass{ 
     @JsonProperty("jobs") 
     ArrayList<Job> jobs; 

     @JsonProperty("users") 
     ArrayList<UserMap> usersMap; 
} 

Bây giờ các công việc phân tích một cách hoàn hảo vào Jobs đối tượng nhưng tôi không thể có được những người sử dụng để phân tích kể từ khi họ có phím năng động. Tôi đã đọc về JsonAnyGetter/Setter và cố gắng tạo bản đồ đối tượng UserMap ánh xạ một chuỗi -> Người dùng như:

public class UserMap { 

private HashMap<String,User> usersMap; 


@JsonAnySetter 
public void add(String key, User user){ 
    usersMap.put(key, user); 
} 

@JsonAnyGetter 
public Map<String, User> getUsersMap(){ 
    return usersMap; 
} 


} 

nhưng không hiệu quả. Tôi nghĩ rằng tôi có thể làm điều đó với một wrapper TypeReference nhưng tôi chỉ có thể nghĩ ra một cách để làm điều đó nếu những bản đồ là loại duy nhất tôi đã nhận được trở lại. Vì tôi nhận được các loại khác nhau trở lại (người dùng và công việc) là nó có thể làm điều này?

+0

json bạn không hợp lệ. Bạn có, sau khi "Anderson" ví dụ –

+0

Xin lỗi đó là một lỗi đánh máy của tôi, sửa nó. Nên là json hợp lệ bây giờ. – pat

Trả lời

9

Giải pháp:

public class MyCustomClass { 
    @JsonProperty("users") 
    public LinkedHashMap<String, User> users; 

    @JsonProperty("jobs") 
    public ArrayList<Job> jobs; 
}  
0

Bạn có thể nhận được thông tin này bằng cách viết trình chỉnh sửa tùy chỉnh của riêng bạn và đăng ký nó với trình ánh xạ đối tượng mà bạn đang sử dụng. Điều này sẽ làm việc như bạn sẽ có toàn quyền kiểm soát cách mỗi đối tượng được deserialized vào một đối tượng User.

Xem this jackson documentation về cách cuộn trình khử dung dịch của riêng bạn.

Cũng muốn nói, nếu bạn có quyền kiểm soát cấu trúc json - tôi sẽ thay đổi giá trị khóa (mà tôi đoán là một ID cho người dùng) là một phần của đối tượng json thực tế như trái ngược với chìa khóa. Điều này sẽ giúp bạn tránh được vấn đề với nhau.

Ví dụ:

"users":{ 
     { 
      "id":"1234", 
      "firstname":"Joe", 
      "lastname":"Smith" 
     }, 
     { 
      "id":"9876", 
      "firstname":"Bob", 
      "lastname":"Anderson" 
     }  
Các vấn đề liên quan