Атрибут в ответе JSON может быть более одного типа - PullRequest
0 голосов
/ 08 января 2020

Я делаю нативное приложение Android, которое отправляет запросы с помощью Retrofit2 к API WooCommerce и получает ответы JSON, сопоставляющие их с классами моделей (POJO) с помощью GSON. Я использую плагин в Android Studio, который автоматически генерирует POJO из JSON ответов.

При отправке запросов в API W C некоторые конечные точки имеют такие ответы:

"meta_data": [
        {
            "id": 2881,
            "key": "wc_productdata_options",
            "value": [
                {
                    "_bubble_new": "\"yes\"",
                    "_bubble_text": "معجون أسنان",
                    "_custom_tab_title": "معجون أسنان Oral-B",
                    "_custom_tab": "",
                    "_product_video": "",
                    "_product_video_size": "",
                    "_product_video_placement": "",
                    "_top_content": "",
                    "_bottom_content": ""
                }
            ]
        },
        {
            "id": 3077,
            "key": "_wp_page_template",
            "value": "default"
        }
    ]

Атрибут value может быть либо String, либо List<Value>, но плагин POJO определяет value как только List<Value> Так что при разборе ответа я получаю сообщение об ошибке GSON expects BEGIN_ARRAY but got STRING instead, когда он достигает "value" : "default".

Как я могу представить, что value может быть строкой ИЛИ списком в классе модели.

Вот автоматически сгенерированный POJO meta_data

import com.google.gson.annotations.SerializedName;
import java.util.List;

public class MetaDatum {

@SerializedName("id")
private Long mId;
@SerializedName("key")
private String mKey;
@SerializedName("value")
private List<Value> mValue;

public Long getId() {
    return mId;
}

public void setId(Long id) {
    mId = id;
}

public String getKey() {
    return mKey;
}

public void setKey(String key) {
    mKey = key;
}

public List<Value> getValue() {
    return mValue;
}

public void setValue(List<Value> value) {
    mValue = value;
}

}

1 Ответ

0 голосов
/ 09 января 2020

Я определил value как тип Object, так что он может быть приведен как угодно к тому, что входит в JSON. Это сработало!

...