it-swarm.com.de

com.google.gson.internal.LinkedHashTreeMap kann nicht in mein Objekt umgewandelt werden

Ich habe eine JSON-Datei 

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

Der Schlüssel ist also ein String "SUBS_ID" und der Wert ist ein Modell mit dem Namen FeatureDetails, das die Attribute "featureSetName, featureName, ..." ... enthält. Ich lese also aus der JSON-Datei mit google.json lib wie folgt

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

dann versuche ich, über diese HashMap eine Schleife zu ziehen, den Wert zu erhalten und in mein FeatureDetails-Modell umzuwandeln.

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

und hier ist mein FeatureDetails-Modell,

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

ich habe jedoch die Ausnahme "com.google.gson.internal.LinkedHashTreeMap kann nicht in com.asset.vsv.models.FeatureDetail umgewandelt werden".

19
Islam

versuche dies:

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

und wenn Sie Ihre Hash-Karte durchgehen, machen Sie folgendes:

for (Map.Entry<String, FeatureDetails> entry : featuresFromJson.entrySet()) {
                    FeatureDetails featureDetails = entry.getValue();
}
31
Алексей

Der Grund, warum Sie dies sehen, ist, dass Sie GSON sagen, dass sie die JSON-Struktur mithilfe der Struktur einer HashMap in der Zeile deserialisieren soll

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

Daher hat GSON keine Ahnung, dass die Unterobjekte in der JSON etwas anderes als einfache Schlüsselwertpaare sind, auch wenn die Struktur möglicherweise der Struktur Ihres FeatureDetails-Objekts entspricht.

Eine Lösung besteht darin, ein Modell zu erstellen, das Ihr FeatureDetails-Objekt umschließt, das als Stamm der gesamten Struktur fungiert. Dieses Objekt könnte ungefähr so ​​aussehen:

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

Und schließlich würden Sie die Klasse dieses Modells bestehen:

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

Update

Als Antwort auf Ihre Frage in dem Kommentar zur Fähigkeit, mehrere FeatureDetails-Objekte hinzuzufügen/zu haben, besteht das Problem derzeit darin, dass Ihr JSON diese Art von Struktur nicht widerspiegelt. Das heißt, der Schlüssel "SUBS_UID" zeigt auf ein einzelnes Objekt, nicht auf ein Arrayobjekt. Wenn Sie diese Fähigkeit haben möchten, muss Ihr Json so geändert werden, dass ein Array von Objekten angezeigt wird.

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

Und dann können Sie einfach die Stammklasse so ändern, dass sie eine Liste von FeatureDetails-Objekten enthält, wie zB:

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

Sag mir, ob das Sinn macht (oder ob ich dich falsch verstanden habe)

5
Paul Richter

der Code befindet sich in Kotlin: use val type = object : TypeToken<HashMap<String, FoodLogEntry>>() {}.type Gson().fromJson(dataStr, type) 

anstelle von val type = object : TypeToken<Map<String, FoodLogEntry>>() {}.type Gson().fromJson(dataStr, type) note: HashMap anstelle von Map

0
Abhilash Das