2012-10-09 22 views
10

Tôi cố gắng để phân tích dữ liệu JSON được gửi từ giao diện người dùng trong điều khiển của tôi sử dụng Spring xây dựng sự ủng hộ Jackson và đây là mã của tôiJsonMappingException không đơn-String phương pháp xây dựng/nhà máy Jackson

final Map<String, CartDataHelper> entriesToUpdateMap = new ObjectMapper().readValue(entriesToUpdate, new TypeReference<Map<String, CartDataHelper>>() 

chuỗi JSON của tôi là

{"0":"{\"categoryCode\":\"shoes\",\"productCode\":\"300050253\",\"initialQty\":\"3\",\"leftoverQty\":\"0\",\"newQty\":\"3\"}", 
"1":"{\"categoryCode\":\"shoes\",\"productCode\":\"300050254\",\"initialQty\":\"3\",\"leftoverQty\":\"0\",\"newQty\":\"3\"}"} 

i kiểm tra định dạng JSON sử dụng một số dịch vụ trực tuyến và nó có vẻ hợp lệ, trong khi gto tryin phân tích dữ liệu JSON tôi đang nhận được ngoại lệ sau đây

org.codehaus.jackson.map.JsonMappingException: Can not instantiate value of type [simple type, class controllers.util.CartDataHelper] from JSON String; no single-String constructor/factory method 

lớp CartDataHelper tôi chứa các thuộc tính đơn giản để cho productCode, categoryCode vv với một constructor không có đối số

+2

Dữ liệu JSON đó giống như dữ liệu được thoát kép. Vì vậy, trong khi nó có thể là hợp lệ, tôi không nghĩ rằng nó đại diện cho những gì bạn nghĩ rằng nó. Nó đại diện cho một đối tượng có hai thuộc tính ("0" và "1") mỗi đối tượng có một giá trị giống như một đối tượng được mã hóa JSON được biểu diễn dưới dạng một chuỗi. – Ramon

+0

@Ramon: có cách nào để thay đổi cấu trúc để đáp ứng điều này không? –

+0

Nó phụ thuộc vào mã sản xuất nó, tôi đoán vậy. – Ramon

Trả lời

6

Như ý kiến ​​đã đề cập, JSON của bạn có chứa Map<String,String> và KHÔNG Map<String,CartDataHelper>: giá trị là JSON Strings, không JSON Objects.

Lý tưởng nhất là bạn sẽ không thử viết các đối tượng dưới dạng chuỗi JSON; và nếu có, mọi thứ sẽ hoạt động.

0

Dường như ở phía khách hàng, json được gửi dưới dạng chuỗi thay vì làm đối tượng. Bằng cách đó ở phía máy chủ bạn nhận được một chuỗi và không phải là một CartDataHelper như bạn giả vờ.

Thử gửi JSON.parse(stringCartDataHelper). Nó làm việc cho tôi với cùng một vấn đề.

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