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".
Ответы
Ответ 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;
}
Сообщите мне, если это имеет смысл (или я вас неправильно понял)