2015-09-07 18 views
16

Şu anda uygulamanızı M desteği için kontrol ediyorum. Düzeltme ile API çağrıları yaparken bu hatayı alıyorum. Bu aldığım bir json hatası gibi görünüyor. Daha başka kimsenin içinde var mı? İşte benim JSON yardımcı sınıfım. Android M + Retrofit + JSON: Saha yapıcısına erişilemiyor

public class JsonHelper { 

    private static final String JSON_PARSE_ERROR = "Unable to parse JSON: "; 
    private static Gson sGson; 
    private static Gson sExposeGson; 

    static { 
     GsonBuilder builder = new GsonBuilder(); 
     builder.registerTypeAdapterFactory(new EnumTypeAdapterFactory()); 
     builder.registerTypeAdapter(BlogCategoryDto.class, new BlogCategorySerializer()); 
     ... 

     sGson = builder.create(); 

     builder.excludeFieldsWithoutExposeAnnotation(); 
     sExposeGson = builder.create(); 
    } 

    public static Gson getGson() { 
     return sGson; 
    } 

    public static Gson getsExposeGsonGson() { 
     return sExposeGson; 
    } 

    public static String toJson(@NonNull Object object) { 
     return sGson.toJson(object); 
    } 

    public static String toJson(@NonNull Object object, @NonNull Type type) { 
     return sGson.toJson(object, type); 
    } 

    public static String toExposeJson(@NonNull Object object) { 
     return sExposeGson.toJson(object); 
    } 

    public static String toExposeJson(@NonNull Object object, @NonNull Type type) { 
     return sExposeGson.toJson(object, type); 
    } 

    public static <T> T fromJson(@NonNull String content, @NonNull Class<T> clazz) 
      throws IllegalStateException { 
     try { 
      return sGson.fromJson(content, clazz); 
     } catch (JsonSyntaxException e) { 
      throw new IllegalStateException(JSON_PARSE_ERROR + content, e); 
     } 
    } 

    public static <T> T fromJson(@NonNull String content, @NonNull Type type) 
      throws IllegalStateException { 
     try { 
      return sGson.fromJson(content, type); 
     } catch (JsonSyntaxException e) { 
      throw new IllegalStateException(JSON_PARSE_ERROR + content, e); 
     } 
    } 
} 

Bu

allready GSON projesinde açıldı bir sorun olduğunu Açıklamalarda belirttiği edildi

D/Retrofit﹕java.lang.SecurityException: Can't make field constructor accessible 
     at java.lang.reflect.Constructor.setAccessible(Constructor.java:334) 
     at com.google.gson.internal.ConstructorConstructor.newDefaultConstructor(ConstructorConstructor.java:97) 
     at com.google.gson.internal.ConstructorConstructor.get(ConstructorConstructor.java:79) 
     at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory.create(ReflectiveTypeAdapterFactory.java:82) 
     at com.google.gson.Gson.getAdapter(Gson.java:359) 
     at com.google.gson.internal.bind.CollectionTypeAdapterFactory.create(CollectionTypeAdapterFactory.java:52) 
     at com.google.gson.Gson.getAdapter(Gson.java:359) 
     at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory.getFieldAdapter(ReflectiveTypeAdapterFactory.java:122) 
     at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory.access$100(ReflectiveTypeAdapterFactory.java:46) 
     at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory$1.<init>(ReflectiveTypeAdapterFactory.java:92) 
     at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory.createBoundField(ReflectiveTypeAdapterFactory.java:91) 
     at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory.getBoundFields(ReflectiveTypeAdapterFactory.java:142) 
     at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory.create(ReflectiveTypeAdapterFactory.java:83) 
     at com.google.gson.Gson.getAdapter(Gson.java:359) 
     at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory.getFieldAdapter(ReflectiveTypeAdapterFactory.java:122) 
     at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory.access$100(ReflectiveTypeAdapterFactory.java:46) 
     at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory$1.<init>(ReflectiveTypeAdapterFactory.java:92) 
     at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory.createBoundField(ReflectiveTypeAdapterFactory.java:91) 
     at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory.getBoundFields(ReflectiveTypeAdapterFactory.java:142) 
     at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory.create(ReflectiveTypeAdapterFactory.java:83) 
     at com.google.gson.Gson.getAdapter(Gson.java:359) 
     at com.google.gson.internal.bind.CollectionTypeAdapterFactory.create(CollectionTypeAdapterFactory.java:52) 
     at com.google.gson.Gson.getAdapter(Gson.java:359) 
     at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory.getFieldAdapter(ReflectiveTypeAdapterFactory.java:122) 
     at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory.access$100(ReflectiveTypeAdapterFactory.java:46) 
     at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory$1.<init>(ReflectiveTypeAdapterFactory.java:92) 
     at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory.createBoundField(ReflectiveTypeAdapterFactory.java:91) 
     at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory.getBoundFields(ReflectiveTypeAdapterFactory.java:142) 
     at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory.create(ReflectiveTypeAdapterFactory.java:83) 
     at com.google.gson.Gson.getAdapter(Gson.java:359) 
     at com.google.gson.Gson.fromJson(Gson.java:809) 
     at com.google.gson.Gson.fromJson(Gson.java:775) 
     at retrofit.converter.GsonConverter.fromBody(GsonConverter.java:63) 
     at retrofit.RestAdapter$RestHandler.invokeRequest(RestAdapter.java:367) 
     at retrofit.RestAdapter$RestHandler.access$100(RestAdapter.java:220) 
     at retrofit.RestAdapter$RestHandler$2.obtainResponse(RestAdapter.java:278) 
     at retrofit.CallbackRunnable.run(CallbackRunnable.java:42) 
     at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1113) 
     at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:588) 
     at retrofit.Platform$Android$2$1.run(Platform.java:142) 
     at java.lang.Thread.run(Thread.java:818) 
+4

zaten GSON projesinde açıldı bir sorun var: https://github.com/google/gson/issues/648 –

+0

otomatik güçlendirme yapmaz dahil GSON ?, neden özel bir Json Fabrikası kullanıyorsunuz? – Smashing

+0

@EfeKahraman sağınızda bir sorun var gibi görünüyor – Eoin

cevap

23

Farklı atılır hatadır.

https://github.com/google/gson/issues/648

Yani onlar kendi kütüphanesini güncelleştirmek kadar beklemek iyi bir fikir gibi görünüyor. Bu arada bir kod satırı ekleyerek hızlı bir düzeltme yapabildim. çözümün here

birinde belirtildiği gibi

static { 
    GsonBuilder builder = new GsonBuilder(); 

    ... 

    builder.excludeFieldsWithModifiers(Modifier.FINAL, Modifier.TRANSIENT, Modifier.STATIC);** 
    builder.excludeFieldsWithoutExposeAnnotation(); 
    sExposeGson = builder.create(); 
} 
+1

Bunu denedim, şimdi bu noktada çökme değil ama gerçek JSON cevabının null değerleri olmayan nesnedeki tüm null değerleri veriyor. Herhangi bir fikir? – Khawar

+1

Modelinizde 'Expose' açıklaması yok – mrroboaat

+0

_builder.excludeFieldsWithoutExposeAnnotation() öğesini kaldırın. – BaiJiFeiLong

0

Android M'de Retrofit2 kullanarak bir sorun var böyle GsonConverterFactory yapılandırılır: Bu benim için çalıştı

Retrofit retrofit = new Retrofit.Builder() 
    .baseUrl(URLWebService) 
    .addConverterFactory(GsonConverterFactory.create(
          new GsonBuilder() 
          .excludeFieldsWithoutExposeAnnotation() 
          .create() 
         )) 
    .client(okHttpClient) 
    .build(); 
3

. Umarım bu birisine yardımcı olabilir.

GsonBuilder builder = new GsonBuilder(); 
builder.excludeFieldsWithModifiers(Modifier.FINAL, Modifier.TRANSIENT, Modifier.STATIC); 
Gson gson = builder.create(); 
1

En iyi yol!

GsonBuilder builder = new GsonBuilder().excludeFieldsWithModifiers(Modifier.FINAL, Modifier.TRANSIENT, Modifier.STATIC); 
    Gson gson = builder.create(); 
    Retrofit retrofit = new Retrofit.Builder().baseUrl(URL) 
     .addConverterFactory(GsonConverterFactory.create(gson)) 
     .build();