2013-06-27 23 views
6

tôi nhận được vấn đề này, tôi không muốn giải quyết vấn đề đó, nhưng tìm đến cách để nói với GSON "bỏ qua lỗi và tiếp tục" phân tích:GSON tránh JsonSyntaxException trở lại ánh xạ một phần

Can't parses json : java.lang.IllegalStateException: 
    Expected a string but was BEGIN_OBJECT at line 1 column 16412 

Mã đã sử dụng:

JsonReader reader = new JsonReader(new StringReader(data)); 
reader.setLenient(true); 
Articles articles = gson.create().fromJson(reader, Articles.class); 

Dữ liệu là (để đơn giản hóa): Bài viết-> Trang-> medias.fields. Một trường trong lỗi hiện tại được định nghĩa là chuỗi nhưng tôi nhận được một đối tượng (nhưng một lần nữa nó chỉ là một lần xuất hiện). Tôi không thể thêm sự bảo vệ ở khắp mọi nơi để câu hỏi của tôi là: "có bỏ qua và tiếp tục trong GSON không?

Tôi muốn tránh JsonSysntaxException với GSON khi có sự cố trên nút và tôi mong đợi ít nhất để truy xuất một phần Trong trường hợp của tôi, tôi sẽ có 99.999% dữ liệu và chỉ trường sai của tôi là null… Tôi biết nó có vẻ không sạch sẽ, nhưng tôi sẽ bật chế độ "nghiêm ngặt" để kiểm tra đơn vị hoặc tích hợp liên tục để phát hiện sự cố và sản xuất tôi sẽ kích hoạt một "chế độ mềm" để ứng dụng của tôi có thể bắt đầu (ngay cả khi phía máy chủ làm lỗi) .Tôi không thể nói với tùy chỉnh của mình, ứng dụng của bạn không thể khởi động vì một bài viết có dữ liệu bên ngoài.

GSON có một " bỏ qua và tiếp tục lỗi "?

+0

hiển thị mã cho chúng tôi ?? – ajduke

+0

u có thể đăng phản hồi từ dịch vụ web, nó sẽ giúp nhiều hơn để giải quyết vấn đề ur – KOTIOS

+0

Tôi đã thêm mã và tôi không muốn khắc phục vấn đề này nhưng tìm cách không kích hoạt ngoại lệ này khi chỉ một lá/nút bị ảnh hưởng bởi một định dạng xấu. Có thể không? – Gros

Trả lời

2

Tôi nghĩ câu trả lời đơn giản là: không, nói chung là không thể.

Do tính chất phân tích đệ quy của thư viện nếu có điều gì đó sai, nó sẽ ném một số loại ngoại lệ. Sẽ thú vị nếu bạn có thể đăng một SSCCE của vấn đề của bạn để thử nghiệm nếu có thể tạo một bộ điều hợp kiểu tùy chỉnh xử lý các ngoại lệ tốt hơn.

1

Đây là giải pháp: Bạn phải tạo TypeAdapterFactory để cho phép bạn chặn mặc định TypeAdapter, nhưng vẫn để bạn truy cập vào TypeAdapter mặc định làm đại biểu. Sau đó, bạn chỉ có thể thử đọc giá trị bằng cách sử dụng ủy nhiệm từ TypeAdapter mặc định và xử lý dữ liệu không mong muốn như bạn muốn.

 public Gson getGson() { 

       return new GsonBuilder() 
          .registerTypeAdapterFactory(new LenientTypeAdapterFactory()) 
       .create(); 
      } 


     class LenientTypeAdapterFactory implements TypeAdapterFactory { 

       public <T> TypeAdapter<T> create(Gson gson, TypeToken<T> type) { 

        final TypeAdapter<T> delegate = gson.getDelegateAdapter(this, type); 

        return new TypeAdapter<T>() { 

         public void write(JsonWriter out, T value) throws IOException { 
          delegate.write(out, value); 
         } 

         public T read(JsonReader in) throws IOException { 
          try { //Here is the magic 
//Try to read value using default TypeAdapter 
           return delegate.read(in); 
          } catch (JsonSyntaxException e) { 
//If we can't in case when we expecting to have an object but array is received (or some other unexpected stuff), we just skip this value in reader and return null 
           in.skipValue(); 
           return null; 
          } 
         } 
        }; 
       } 
    } 
Các vấn đề liên quan