Подтвердить что ты не робот

Com.google.gson.internal.LinkedHashTreeMap не может быть перенесен на мой объект

У меня JSON файл выглядит как

{
    "SUBS_UID" : {
        "featureSetName" : "SIEMENSGSMTELEPHONY MULTISIM",
        "featureName" : "MULTISIMIMSI",
        "featureKey" : [{
                "key" : "SCKEY",
                "valueType" : 0,
                "value" : "0"
            }
        ]
    },
}

Таким образом, ключ является строкой "SUBS_ID", а значение представляет собой модель FeatureDetails, которая содержит атрибуты "featureSetName, featureName,...". Поэтому я читаю из файла JSON с помощью google.json lib, как это,

HashMap<String, FeatureDetails> featuresFromJson = new Gson().fromJson(JSONFeatureSet, HashMap.class);

то я пытаюсь перебрать этот HashMap, чтобы получить значение и применить его к моей модели FeatureDetails,

for (Map.Entry entry : featuresFromJson.entrySet()) {
                    featureDetails = (FeatureDetails) entry.getValue();
                }

и вот моя модель FeatureDetails,

public class FeatureDetails {

    private String featureSetName;
    private String featureName;
    private ArrayList<FeatureKey> featureKey;
    private String groupKey;
    private String groupValue;

    public FeatureDetails() {
        featureKey =  new ArrayList<FeatureKey>();
    }

    public ArrayList<FeatureKey> getFeatureKey() {
        return featureKey;
    }

    public void setFeatureKey(ArrayList<FeatureKey> featureKey) {
        this.featureKey = featureKey;
    }

    public String getGroupKey() {
        return groupKey;
    }

    public void setGroupKey(String groupKey) {
        this.groupKey = groupKey;
    }

    public String getGroupValue() {
        return groupValue;
    }

    public void setGroupValue(String groupValue) {
        this.groupValue = groupValue;
    }

    public String getFeatureName() {
        return featureName;
    }

    public void setFeatureName(String featureName) {
        this.featureName = featureName;
    }

    public String getFeatureSetName() {
        return featureSetName;
    }

    public void setFeatureSetName(String featureSetName) {
        this.featureSetName = featureSetName;
    }
} 

но я получил исключение "com.google.gson.internal.LinkedHashTreeMap не может быть добавлено в com.asset.vsv.models.FeatureDetail".

4b9b3361

Ответ 1

попробуйте следующее:

HashMap<String, FeatureDetails> featuresFromJson = new Gson().fromJson(JSONFeatureSet, new TypeToken<Map<String, FeatureDetails>>() {}.getType());

и когда вы просматриваете карту хэша, сделайте следующее:

for (Map.Entry<String, FeatureDetails> entry : featuresFromJson.entrySet()) {
                    FeatureDetails featureDetails = entry.getValue();
}

Ответ 2

Причина, по которой вы видите это, заключается в том, что вы передаете GSON десериализацию структуры JSON, используя структуру HashMap в строке

... = new Gson().fromJson(JSONFeatureSet, HashMap.class);
                                          ^^
                                          Right here

В результате GSON не подозревает, что вспомогательные объекты в JSON представляют собой нечто иное, чем простые пары ключ-значение, хотя структура может соответствовать структуре вашего объекта FeatureDetails.

Одним из решений является создание модели, которая обертывает ваш объект FeatureDetails, который будет действовать как корень всей структуры. Этот объект может выглядеть примерно так:

public class FeatureDetailsRoot{
    private FeatureDetails SUBS_UID; // poor naming, but must match the key in your JSON
}

И, наконец, вы пройдете этот класс модели:

= new Gson().fromJson(JSONFeatureSet, FeatureDetailsRoot.class)

Обновление

В ответ на ваш вопрос в комментарии относительно возможности добавления/наличия нескольких объектов FeatureDetails в настоящее время проблема заключается в том, что ваш JSON не отражает такую ​​структуру. Значением, ключ "SUBS_UID" указывает на один объект, а не на объекты массива. Если вы хотите иметь эту способность, тогда ваш json нужно будет изменить так, чтобы он показывал массив объектов, например:

{
    "SUBS_UID" : [{
       "featureSetName" : "Feature set name #1",
       ...attributes for feature #1
     },
     {
       "featureSetName" : "Feature set name #2",
       ...attributes for feature #2
     },
     ...other features
     ]
}

И тогда вы можете просто изменить корневой класс, чтобы он содержал список объектов FeatureDetails, например:

public class FeatureDetailsRoot{
    private List<FeatureDetails> SUBS_UID;
}

Сообщите мне, если это имеет смысл (или я вас неправильно понял)