2013-05-23 42 views
7

Tôi đang cố gắng phân tích cú pháp json thành java.Chuỗi JSON đến đối tượng Java sử dụng GSON

Tôi có chuỗi sau đó là json hợp lệ theo jsonlint.com

private final static String LOC_JSON = 
     "[" 
     +"{" 
     +" \"lat1\": 39.737567," 
     +" \"lat2\": 32.7801399," 
     +" \"long1\": -104.98471790000002," 
     +" \"long2\": -96.80045109999998" 
     +"}," 
     +" [" 
     +"  {" 
     +"   \"lat\": {" 
     +"    \"b\": 38.88368709500021," 
     +"    \"d\": 40.620468491667026" 
     +"   }," 
     +"   \"long\": {" 
     +"   \"b\": -105.75306170749764," 
     +"   \"d\": -104.675854661387" 
     +"   }" 
     +"  }" 
     +" ]" 
     +"]"; 

Tôi cố gắng để phân tích nó thành một đối tượng và tôi nhận được lỗi sau. "Dự kiến ​​BEGIN_OBJECT nhưng BEGIN_ARRAY tại dòng 1 cột 2"

  Gson gson = new Gson(); 
     BoxSearch b = gson.fromJson(LOC_JSON, BoxSearch.class); 

BoxSearch gồm này.

private Number lat1; 
private Number lat2; 
private Number long1; 
private Number long2; 
private Boxes[] boxes; 

Hộp là đối tượng Latitude và đối tượng Kinh độ được xác định giống hệt nhau.

private String b; 
private String d; 

tôi có thể phân tích các thuộc tính cấp độ cao hơn (lat1, lat2, long1 và long2) vào một đối tượng BoxSearch đơn giản hơn mà chỉ có những 4 thuộc tính. Vấn đề xảy ra khi json và đối tượng phức tạp hơn. Thậm chí có thể làm những gì tôi đang cố gắng không?

Tôi hy vọng tôi đã cung cấp đủ thông tin để nhận trợ giúp. Tôi rất sẵn lòng cung cấp thêm thông tin hoặc thậm chí là một dự án thử nghiệm nếu cần thiết. Tôi đang chạy nó như một bài kiểm tra junit.

Cảm ơn.

+3

có thể trùng lặp của [GSON ném "Dự kiến ​​BEGIN \ _OBJECT nhưng đã BEGIN \ _ARRAY"?] (Http://stackoverflow.com/questions/9598707/gson-throwing-expected-begin-object-but-was-begin -array) - JSON của bạn là một mảng, không phải là một đối tượng. Bạn sẽ có một vấn đề mặc dù bởi vì nó là một mảng chứa các loại đối tượng khác nhau (một đối tượng và một mảng) mà bạn không thể xử lý mà không cần viết một deserializer tùy chỉnh –

+0

@BrianRoach này giống như một câu trả lời;) –

+0

@RC. Yeah ... Hmm. Tôi nghĩ rằng có lẽ tôi sẽ di chuyển nó, Q cũ câu trả lời tại sao anh ta nhận được lỗi, nhưng độ phân giải cho trường hợp của mình là khác nhau –

Trả lời

16

Lý do gây ra lỗi là JSON của bạn ở cấp cao nhất là mảng chứ không phải đối tượng. Nó được bao phủ bởi GSON throwing "Expected BEGIN_OBJECT but was BEGIN_ARRAY"?.

Tuy nhiên, giải pháp sẽ không hoạt động đối với JSON của bạn vì bạn có một mảng các loại hỗn hợp (một đối tượng và mảng) chứ không phải là một mảng của một loại đối tượng. Cho rằng bạn sẽ phải viết một deserializer tùy chỉnh (Xem The section of the Gson user's guide that covers this) hoặc sử dụng Gson của JsonParser lớp học trực tiếp và trích xuất dữ liệu từ cây phân tích cú pháp.

Chỉnh sửa từ ý kiến ​​trên:

Nếu bạn là người tạo ra JSON, nó trông như những gì bạn muốn là một mảng của BoxSearch đối tượng?

Dựa trên lớp Java BoxSearch của bạn, bạn sẽ cần JSON cấu trúc như:

[ 
    { 
     "lat1" : 39.737567, 
     "lat2" : 32.7801399, 
     "long1" : -104.98471790000002, 
     "long2" : -96.80045109999998, 
     "boxes" : [ 
        { 
         "lat": { 
          "b": 38.88368709500021, 
          "d": 40.620468491667026 
         }, 
         "long": { 
          "b": -105.75306170749764, 
          "d": -104.675854661387 
         } 
        } 
        ] 
    } 
] 

Tuy nhiên, cách bạn đã Boxes lớp xác định sẽ không hoạt động cho điều đó. (Bạn có ý nghĩa để có một mảng của họ?). Như-là nó sẽ cần phải xem xét như:

class Boxes { 
    Box lat; 
    @SerializedName("long") 
    Box lon; 
} 

class Box { 
    String b; 
    String d; 
} 

Bây giờ bạn có một mảng chứa một loại đối tượng (BoxSearch) mà bạn có thể deserialize với:

Type collectionType = new TypeToken<Collection<BoxSearch>>(){}.getType(); 
Collection<BoxSearch> boxSearchCollection = gson.fromJson(json, collectionType); 

Nếu bạn thực sự không cần một mảng trong số này, thoát khỏi các mảng bên ngoài và chỉ cần làm:

gson.fromJson(json, BoxSearch.class); 
+0

Cảm ơn bạn rất nhiều Brian, tinh chỉnh nhỏ cho json và tất cả là tốt. Tôi sẽ bình chọn câu trả lời này nhưng tôi không có "đường phố". Mã hoạt động như một nhà vô địch. Trong trường hợp mọi người sao chép và dán câu trả lời này, Box dài; cần được đổi tên thành :-) – user2415153

+0

Ồ, vâng tôi cần mảng. Cảm ơn một lần nữa. – user2415153

+0

@ user2415153 Tôi đã thay đổi mã để nó sẽ hoạt động với '" long "' trong JSON - xem câu trả lời ngay bây giờ :) Tôi không nhận thấy điều đó, xin lỗi. Đối với upvoting - bạn có thể chấp nhận câu trả lời của tôi;) và vui vì tôi có thể giúp đỡ! –

13
Gson gson = new Gson(); 
gson.fromJson(jsonStr,YourClass.class); 

rất dễ dàng.

+0

nó giúp tôi chuyển đổi một đối tượng json có một danh sách bên trong. Tôi chuyển đổi chuỗi json thành Object.class – Ashkan

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