2017-03-26 74 views
0

我从DB使用下面的下面的方法(从spark-java framework方法)返回的数据:如何序列表对象GSON

get("/data_on_page_load", "application/json", (Request request, Response response) -> { 
    List<Post> list = Post.findAll(); // NEED TO SERIALIZE THE RESPONSE 
    System.out.println("list is " + list); 
    return (list); 
}, new JsonTransformer()); 

数据从数据库返回:

[Model: com.soul.seeker.models.Post, table: 'post', attributes: {created_at=2017-03-26 04:06:35.0, details=aaa, id=36, title=Eventsa, url=eventsa, userImage=assets/img/spiritual-icon4.png, username=null}] 

Post.findAll();http://javalite.io/record_selection#finding-all-records方法来获取所有记录

Model: com.soul.seeker.models.Post低于POJO类:

public class Post extends Model{ 
    private String title; 
    private String details; 
    private String username; 
    private String userImage; 
    private String url; 
    private List categories; 

    //Getters and Setters removed for brevity 
} 

我试图序列使用GSON TypeTokenTypeAdapter

ClassTypeAdapterFactory就把出来:

public class ClassTypeAdapterFactory implements TypeAdapterFactory { 

    @Override 
    public <T> TypeAdapter<T> create(Gson gson, TypeToken<T> typeToken) { 

     if(!Class.class.isAssignableFrom(typeToken.getRawType())) { 
      return null; 
     } 

     return (TypeAdapter<T>) new ClassTypeAdapter(); 
    } 
} 

ClassTypeAdapter:

public class ClassTypeAdapter extends TypeAdapter<Class<?>> { 
    @Override 
    public void write(JsonWriter jsonWriter, Class<?> clazz) throws IOException { 
     if(clazz == null){ 
      jsonWriter.nullValue(); 
      return; 
     } 
     jsonWriter.value(clazz.getName()); 
    } 

    @Override 
    public Class<?> read(JsonReader jsonReader) throws IOException { 
     if (jsonReader.peek() == JsonToken.NULL) { 
      jsonReader.nextNull(); 
      return null; 
     } 
     Class<?> clazz = null; 
     try { 
      clazz = Class.forName(jsonReader.nextString()); 
     } catch (ClassNotFoundException ex) { 
      ex.printStackTrace(); 
     } 
     return clazz; 
    } 
} 

这里我使用JsonTransformer它实现ResponseTransformerspark-java ResponseTransformer interface

public class JsonTransformer implements ResponseTransformer { 

    private Gson gson = new Gson(); 

    @Override 
    public String render(Object model) { 
     GsonBuilder gsonBuilder = new GsonBuilder(); 
     gson = gsonBuilder.registerTypeAdapterFactory(new ClassTypeAdapterFactory()).create(); 
     return gson.toJson(model); 
    } 
} 

现在的问题是出放还JSON中包含了序列化类,而不是POJO类的唯一返回List对象。我是Gson序列化的Java &。

任何人都可以帮助实现TypeAdapter只返回List对象吗?例这样的:

Type listOfTestObject = new TypeToken<List<TestObject>>(){}.getType(); 
String s = gson.toJson(list, listOfTestObject); 
List<TestObject> list2 = gson.fromJson(s, listOfTestObject); 

回答

0

我认为你将不再需要键入一个响应变压器,您可以使用一个新GSON对象一样,直接在response transformer documentation最后一个片段。它会像这样结束:

get("/data_on_page_load", (req, res) -> { 
     res.type("application/json; charset=UTF-8"); 
     List<Post> list = Post.findAll(); 
     System.out.println("list is " + list); 
     return list; 
    }, new Gson()::toJson);