如何在JSONarray中使用动态密钥编写Pojo

时间:2019-01-15 05:35:29

标签: android retrofit pojo

我什至不知道这是否是一个有效的问题,但是由于某些键是动态的,因此我很难将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
}

3 个答案:

答案 0 :(得分:2)

您可以根据情况使用Json ObjectGenerics

  

使用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;
}
}

快乐的编码...!

任何查询将不胜感激...