2015-05-29 5 views
0

У меня возникли проблемы с преобразованием gson в JSON, используя библиотеку Google gson. Я использую веб-фреймворк Java Spark, а ResponseTransformer является частью Spark lib. Параметр аргумента модели может быть любым POJO.Преобразование gson в JSON

public class JsonTransformer implements ResponseTransformer { 

    private Gson gson = new Gson(); 

    @Override 
    public String render(Object model) { 

     String json = null; 
     if (model instanceof java.util.List) { 
      model = ((java.util.List) model).get(0); 
     } 
     try { 
      json = gson.toJson(model); 
     } catch (Exception e) { 
      e.printStackTrace(); 
      System.exit(5); 
     } 

     return json; 
    } 
} 

есть какая-то проблема, когда модель объекта List, библиотека gson испытывает проблемы преобразования/сериализации в JSON String.

Так что это просто быстрое решение, чтобы попытаться отладить это: я пытаюсь переназначить модель для первого элемента списка моделей, если модель является экземпляром List. Так что это скорее основной вопрос Java ... Когда я пытаюсь переназначить модель для первого элемента модели, Java не позволяет это произойти. Почему это так?

Кроме того, если кто-нибудь знает, почему в этом случае gson так тяжело, пожалуйста, LMK. Этого не должно быть. Нет очевидной бесконечной рекурсии.

Чтобы доказать это, здесь содержание:

enter image description here

Я получаю бесконечную рекурсию StackTrace хотя:.

java.lang.StackOverflowError в com.google.gson.internal $ Gson $ Types.resolve ($ Gson $ Types.java: 375) at com.google.gson.internal. $ Gson $ Types.resolve ($ Gson $ Types.java: 380) at com.google.gson.internal $ Gson $ Types.resolve ($ Gson $ Types.java: 375) at com.google.gson.internal. $ Gson $ Types.resolve ($ Gson $ Types.java: 380) at com.google.gson.internal. $ Gson $ Types.resolve ($ Gson $ Types.java: 375) at com.google.gson.internal $ Gson $ Types.resolve ($ Gson $ Types.java: 380) at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory $ 1. (ReflectiveTypeAdapterFactory.java:82) at com.google.gson.internal.bind .ReflectiveTypeAdapterFactory.createBoundField (ReflectiveTypeAdapterFactory.java:81) на com.google.gson.internal.bind.ReflectiveTypeAdapterFactory.getBoundFields (ReflectiveTypeAdapterFactory.java:118) в com.google.gson.internal.bind.ReflectiveTypeAdapterFactory.create (ReflectiveTypeAdapterFactory .java: 72) at com.google.gson.Gson.getAdapter (Gson.java:356) at com.google.gson.internal.bind.ReflectiveTypeAdapterFa ctory $ 1. (ReflectiveTypeAdapterFactory.java:82) в com.google.gson.internal.bind.ReflectiveTypeAdapterFactory.createBoundField (ReflectiveTypeAdapterFactory.java:81) на com.google.gson.internal.bind.ReflectiveTypeAdapterFactory.getBoundFields (ReflectiveTypeAdapterFactory. java: 118) на com.google.gson.internal.bind.ReflectiveTypeAdapterFactory.create (ReflectiveTypeAdapterFactory.java:72) на com.google.gson.Gson.getAdapter (Gson.java:356) на com.google. gson.internal.bind.ReflectiveTypeAdapterFactory $ 1. (ReflectiveTypeAdapterFactory.java:82) at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory.createBoundField (ReflectiveTypeAdapterFactory.java:81) на com.google.gson.internal.bind. ReflectiveTypeAdapterFactory.getBoundFields (ReflectiveTypeAdapterFactory .java: 118) at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory.create (ReflectiveTypeAdapterFactory.java:72) at com.google.gson.Gson.getAdapter (Gson.java:356) at com.google .gson.internal.bind.ReflectiveTypeAdapterFactory $ 1. (ReflectiveTypeAdapterFactory.java:82) at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory.createBoundField (ReflectiveTypeAdapterFactory.java:81) at com.google.gson.internal.bind ,ReflectiveTypeAdapterFactory.getBoundFields (ReflectiveTypeAdapterFactory.java:118) at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory.create (ReflectiveTypeAdapterFactory.java:72) at com.google.gson.Gson.getAdapter (Gson.java:356) в com.google.gson.internal.bind.ReflectiveTypeAdapterFactory 1 $. (ReflectiveTypeAdapterFactory.java:82) в com.google.gson.internal.bind.ReflectiveTypeAdapterFactory.createBoundField (ReflectiveTypeAdapterFactory.java:81) в com.google. gson.internal.bind.ReflectiveTypeAdapterFactory.getBoundFields (ReflectiveTypeAdapterFactory.java:118) на com.google.gson.internal.bind.ReflectiveTypeAdapterFactory.create (ReflectiveTypeAdapterFactory.java:72) на com.google.gson.Gson.getAdapter (Gson.java:356)

объект Я пытаюсь преобразовать из POJO в JSON выглядит следующим образом:

public class Model { 

    private String id; 
    private String title; 
    private boolean done; 
    private Date createdOn; 

    public Model(BasicDBObject dbObject) { 
     this.id = ((ObjectId) dbObject.get("_id")).toString(); 
     this.title = dbObject.getString("title") == null ? "placeholder title" : dbObject.getString("title"); 
     this.done = ((Boolean)dbObject.getBoolean("done")) == null ? false : dbObject.getBoolean("done"); 
     this.createdOn = dbObject.getDate("createdOn") == null ? new Date() : dbObject.getDate("createdOn"); 
    } 
} 
+0

Можете ли вы поделиться исключением? – zengr

+0

уверен, добавит его на вопрос –

+0

Кажется, есть какая-то проблема, когда программа пытается установить поле id модели на ArrayList вместо String ... это странно –

ответ

1

Ваша проблема с BasicDBObject быть конструктор по умолчанию аргумент. Гсону это не нравится. Удалите это, и он будет работать. Read: https://sites.google.com/site/gson/gson-user-guide#TOC-Writing-a-Deserializer

+0

да, но для чего я могу заменить BasicDBObject? –

+1

Просто перегрузите конструктор, который является no-op без аргументов. Если вы действительно хотите заставить gson использовать этот конструктор, вам нужно использовать пользовательский JsonDeserializer и зарегистрироваться в gson. – zengr

+0

@AlexMills, если решение сработало для вас, тогда вы можете выбрать правильный ответ. – zengr

Смежные вопросы