如果您不想拥有单独的用户对象,而是将 userName 作为 TweetEntity 中的属性,您可以执行以下操作:
- 编写自定义 TweetEntity 反序列化器
- 通过调用 getAsJsonObject 两次(在用户和名称上)提取用户名
- 以正常方式反序列化 TweetEntity(使用正确的日期格式)
- 在 TweetEntity 上设置用户名
测试
为了能够进行测试,我们需要访问 TweetEntity 中的一些属性:
Date getCreatedAt() {
return createdAt;
}
void setUserName(String userName) {
this.userName = userName;
}
String getUserName() {
return userName;
}
TweetEntity 反序列化器
您的示例中使用的日期字符串如下所示:
Sat Jun 15 19:21:29 +0000 2019
对于这样的日期,您必须为反序列化指定自定义格式。
对应的日期格式为:
E MMM dd hh:mm:ss Z yyyy
所以我们首先提取用户 JsonElement 并从那里提取名称 JsonElement。
在使用自定义日期格式(并且缺少 userName)反序列化 TweetEntity 实例后,我们可以设置 userName 属性。
在代码中是这样的:
import com.google.gson.*;
import java.lang.reflect.Type;
public class TweetEntityDeserializer implements JsonDeserializer<TweetEntity> {
@Override
public TweetEntity deserialize(JsonElement json, Type typeOfT, JsonDeserializationContext context) throws JsonParseException {
JsonElement user = json.getAsJsonObject().get("user");
JsonElement userName = user.getAsJsonObject().get("name");
Gson g = new GsonBuilder().setDateFormat("E MMM dd hh:mm:ss Z yyyy").create();
TweetEntity entity = g.fromJson(json, TweetEntity.class);
entity.setUserName(userName.getAsString());
return entity;
}
}
测试
让我们用一个小的、独立的 Java 程序来试试吧。
import com.google.gson.*;
public class Main {
public static void main(String[] args) {
String json = "{\"created_at\":\"Sat Jun 15 19:21:29 +0000 2019\",\"text\":\"RT @BuzzTechy: [BEST] Udemy Course - Create a Python Powered Chatbot in Under 60 Minutes \\n\\nsomeUrl \\n\\n#AI #Python #Chatbot?\",\"source\":\"<a href=\\\"https://allentowngroup.com\\\" rel=\\\"nofollow\\\">bobbidigi</a>\",\"truncated\":false,\"in_reply_to_screen_name\":\"asdsf\",\"user\":{\"id\":1724601306,\"name\":\"Rob's Coding News In The Hood\"}}";
Gson g = new GsonBuilder()
.registerTypeAdapter(TweetEntity.class, new TweetEntityDeserializer())
.create();
TweetEntity entity = g.fromJson(json, TweetEntity.class);
System.out.println("created at: " + entity.getCreatedAt());
System.out.println("userName: " + entity.getUserName());
}
}
输出到控制台
created at: Sat Jun 15 21:21:29 CEST 2019
userName: Rob's Coding News In The Hood
因此,userName 字段在没有嵌套到 TweetEntity 对象中的情况下被收集,并且观察到了自定义日期格式。所以它有效!