将具有子对象的自定义JsonObject发送到服务器失败

时间:2016-03-23 17:45:11

标签: java android json playframework retrofit

我正在尝试将来自我的Android客户端的对象发布到我的Play Framework Java REST API以持久保存到数据库。

我使用Retrofit执行API调用,使用Realm进行本地设备存储。使用客户端设备中的Gson库来处理JSON。

我有一个自定义类在发送之前将我的对象转换为JSON,因为如果我不这样做,任何子对象都将包含额外的信息,例如 columnInfo ,这些信息将无法在服务器,它将无法将对象转换为合法的实体。

服务器堆栈跟踪消息

  

引起:   com.fasterxml.jackson.databind.exc.UnrecognizedPropertyException:   无法识别的字段“columnInfo”(类models.UserTbl),未标记为   可忽略的(5个已知属性:“dateCreated”,“id”,“name”,“email”,   “dateUpdated”])

自定义序列化类

public class UserBookSerializer implements JsonSerializer<UserBook> {
    @Override
    public JsonElement serialize(UserMovie src, Type typeOfSrc, JsonSerializationContext context) {
        final JsonObject jsonObject = new JsonObject();
        jsonObject.addProperty("id", src.getId());
        jsonObject.addProperty("bookId", src.getBookId());
        jsonObject.addProperty("user", String.valueOf(context.serialize(src.getUser()))); // here is the issue
        jsonObject.addProperty("isSaved", src.isSaved());

        return jsonObject;
    }
}

以上是我的尝试,但是没有成功。有人知道如何解决这个问题吗?

2 个答案:

答案 0 :(得分:0)

你可以用gson轻松地序列化类,让我们说你想要在服务器上获得的Json

{  
  "name":"never",
  "age":5,
  "data":{  
    "id":"2fds4",
    "locale":"us"
  }
}

您编写以下结构

class User {
   String name;
   long age;
   Data data;
}

class Data {
   String id;
   String locale;
}

然后您只需将User的实例传递给您的改造版,它就会将其序列化。

答案 1 :(得分:0)

您可以编辑UserMovie类并使用Gson的@Expose注释来明确标记要发送的属性。创建Retrofit实例时,它应与GsonBuilder.excludeFieldsWithoutExposeAnnotation()一起使用。

https://google-gson.googlecode.com/svn/trunk/gson/docs/javadocs/com/google/gson/annotations/Expose.html