Как написать Pojo, используя динамический ключ внутри JSONarray - PullRequest
0 голосов
/ 15 января 2019

Я даже не знаю, является ли это правильным вопросом, но мне трудно преобразовать результат API в POJO, поскольку некоторые ключи являются динамическими.

{
"data": [{
        "something_edit": true
    },
    {
        "test_null": false
    }
],
"success": true

}

Как видите, данные внутри ключа являются динамическими. Я пытался использовать jsonschema2pojo или другой конвертер, но он объявляет именованную переменную, что не является хорошим результатом. Кстати, я использую модификацию и библиотеку GSON

EDIT:

Итак, последовательность действий - вот ключи, которые я спросил в API. Таким образом, для примера я спросил что-то: Результат данных будет.

{

"data": [{
        "something_edit1": true
    }, {
        "something_edit2": false
    },
    {
        "something_edit3": false
    }
],

"success": true
}

Ответы [ 3 ]

0 голосов
/ 15 января 2019

Трудно определить, или вам нужно объявить все возможные поля в вашем POJO, или написать свой собственный парсер json, расширяющий парсер Gson, или использовать JsonElement, который можно преобразовать в массив, объект и примитив json, на основе этого результата вы можно преобразовать обратно в какое-то конкретное pojo.

   /**
 * this will convert the whole json into map which you can use to determine the json elements
 *
 * @param json
 */
private void getModelFromJson(JsonObject json) {
    Gson gson = new Gson();
    Map<String, JsonElement> jsonElementMap = gson.fromJson(json.toString(), new TypeToken<Map<String, JsonElement>>() {
    }.getType());
    for (Map.Entry<String, JsonElement> jsonElementEntry : jsonElementMap.entrySet()) {
        if (jsonElementEntry.getValue().isJsonPrimitive()) {
            //json primitives are data types, do something
            //get json boolean
            //you can here also check if json element has some json object or json array or primitives based on that
            //you can convert this to something else after comparison
            if (true) {
                InterestModelResponse response = gson.fromJson(jsonElementEntry.getValue().getAsJsonObject().toString(), InterestModelResponse.class);
                //use your dynamic converted model
            }
        } else {
            //do something else
        }
    }

}
0 голосов
/ 15 января 2019

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

Удачного кодирования ...!

любой запрос будет оценен ...

0 голосов
/ 15 января 2019

Вы можете использовать Json Object или Generics для вашего состояния.

Используя Json Object, вы можете проверить, существует ли ключ в вашем json.

if(yourJsonObject.hasOwnProperty('key_name')){
   // do your work here
}

Используя Generic, вы должны проверить, есть ли у вашего Pojo экземпляр Pojo.

if(YourMainPOJO instanceOf YourChildPojo){
   // do your work here
}

Попробуйте просмотреть только Общая часть этой ссылки .

...