我什至不知道这是否是一个有效的问题,但是由于某些键是动态的,因此我很难将API结果转换为POJO。
{
"data": [{
"something_edit": true
},
{
"test_null": false
}
],
"success": true
}
您可以看到内部关键数据是动态的。我尝试使用jsonschema2pojo或其他转换器,但是它声明了一个命名变量,但这不是一个好的结果。顺便说一句,我正在使用改造和GSON库
编辑:
这是流程,因此密钥是我在API上要求的密钥。因此,例如,我问了something_edit1,something_edit2和something_edit3。数据结果将是。
{
"data": [{
"something_edit1": true
}, {
"something_edit2": false
},
{
"something_edit3": false
}
],
"success": true
}
答案 0 :(得分:2)
您可以根据情况使用Json Object
或Generics
。
使用Json Object可以检查JSON中是否存在密钥。
if(yourJsonObject.hasOwnProperty('key_name')){
// do your work here
}
如果您的Pojo中有泛型实例,则必须使用泛型 Pojo。
if(YourMainPOJO instanceOf YourChildPojo){
// do your work here
}
尝试仅查看此link中的通用部分。
答案 1 :(得分:1)
这很难确定,或者您必须在POJO中声明所有可能的字段,或者编写自己的json解析器以扩展Gson解析器或使用JsonElement,根据该结果,可以将JsonElement转换为json数组,对象和基元可以转换回特定的pojo。
{ WebElement idProof = FrmrPage.idProof(driver);
idProof.click();
Genlib.sleep(2000);
WebElement voterId = FrmrPage.idProofVoterId(driver, datArr[8]);
voterId.click();
test.pass("ID Proof: " + datArr[8]);
Genlib.sleep(1000);
}
答案 2 :(得分:0)
2年前,我们做了一个项目,其中我们必须处理使用同一类型的不同类型对象的通知数据,而在使用改造时要处理
这是我们改造的Creator
类
class Creator {
public static FullTeamService newFullTeamService() {
final HttpLoggingInterceptor interceptor = new HttpLoggingInterceptor();
interceptor.setLevel(HttpLoggingInterceptor.Level.BODY);
final OkHttpClient client = new OkHttpClient.Builder()
.addInterceptor(interceptor)
.build();
final Retrofit retrofit = new Retrofit.Builder()
.baseUrl(FullTeamService.HOST)
.client(client)
.addConverterFactory(GsonConverterFactory.create(GsonUtils.get()))
.addCallAdapterFactory(RxJavaCallAdapterFactory.create())
.build();
return retrofit.create(FullTeamService.class);
}
}
和GsonUtils.java
是:
public class GsonUtils {
private static final Gson sGson = new GsonBuilder()
.setDateFormat("yyyy-MM-dd'T'HH:mm:ss")
.registerTypeAdapter(NotificationObject.class, new NotificationDeserializer())
.create();
private GsonUtils() {}
public static Gson get() {
return sGson;
}
}
NotificationObject
类似于:
public class NotificationObject {
@SerializedName("ID")
@Expose
private long ID;
@SerializedName("type")
@Expose
private Type type;
@SerializedName("DataObject")
@Expose
private NotificationDataObject dataObject;
public void setDataObject(NotificationDataObject newsFields) {
dataObject = newsFields;
}
@SuppressWarnings("unchecked")
public <T> T getDataObject() {
return (T) dataObject;
}
public enum Type {
@SerializedName("0")
CHAT_MESSAGE,
@SerializedName("10")
GAME_APPLICATION,
@SerializedName("20")
GAME_APPLICATION_RESPONSE,
@SerializedName("30")
GAME_INVITE....
}
}
NotificationDataObject
,就像新班级一样:
public class NotificationDataObject {}
最后NotificationDeserializer
就像:
public class NotificationDeserializer implements JsonDeserializer<NotificationObject> {
@Override
public NotificationObject deserialize(JsonElement json, Type typeOfT, JsonDeserializationContext context) throws JsonParseException {
final JsonObject itemBean = json.getAsJsonObject();
final NotificationObject object = GsonUtils.getSimpleGson().fromJson(itemBean, NotificationObject.class);
switch (object.getType()) {
case CHAT_MESSAGE:
break;
case GAME_APPLICATION:
object.setDataObject(GsonUtils.get().fromJson(itemBean.get("DataObject").getAsJsonObject(),
GameApplicationNotification.class));
break;
case GAME_APPLICATION_RESPONSE:
object.setDataObject(GsonUtils.get().fromJson(itemBean.get("DataObject").getAsJsonObject(),
GameApplicationResponseNotification.class));
break;
case GAME_INVITE:
object.setDataObject(GsonUtils.get().fromJson(itemBean.get("DataObject").getAsJsonObject(),
GameInviteNotification.class));
break;
}
return object;
}
}
快乐的编码...!
任何查询将不胜感激...