2016-11-09 2 views
0

Ich habe eine JSON-Zeichenfolge mit erstellt, die gültig ist. Ich habe folgenden Weg verwendet, um das Json-Objekt zu erstellen.Gson malformedJsonException beim Casting von JSON-String zu Objekt

Map myMap=new HashMap(); 
myMap.put("dryRunTest",dryRunTestObj); 
myMap.put("port",22); 
myMap.put("Repository",RepositoryObj); 
etc... 

Map temp = new HashMap(); 
temp.put("configuration",myMap); 
new GsonBuilder().setPrettyPrinting().create().toJson(temp); 
//This gave me the below Json Object that would write to a file. 

{ 
    "configuration": { 
    "dryRunTest": { 
     "id": null, 
     "defaultName": "sample.xml", 
     "ParamsMap": null, 
     "defaultVersion": "1.2", 
     "dryRunTestOn": true 
    }, 
    "port": 2323, 
    "ip": "11.11.11.111", 
    "configFile": "config.json", 
    "Name": "007", 
    "URL": "http://11.111.111.51/ma/api/ag/", 
    "Password": "123", 
    "configDirectory": "sss", 
    "platform": "Windows7", 
    "Repository": { 
     "repositoryURL": "http://11.11.111.11/" 
    } 
    } 
} 

Ich habe versucht, wie folgende Repository-Objekt-Repository-JSON-String zu erstellen.

class Repository{ 
String repositoryURL; 
getter and setters 
} 

Dann desalinize i Json-Objekt,

Map mymap= new Gson().fromJson(JsonObjectReadFromFile(aboveString), HashMap.class); 

RepositoryJsonStringvalue = mymap.get("Repository"); 

Repository r=new Gson().fromJson(RepositoryJsonStringvalue, Repository.class); 

Es zurückkehren folgende Ausnahme serialisiert.

com.google.gson.JsonSyntaxException: com.google.gson.stream.MalformedJsonException: Unterminated object at line 1 column 21 

Scheint, wie Problem mit ihm repositoryURL Wert war aber ich hatte denselben Wert in einer anderen Top-Level-Attribut URL=http://11.11.111.11/ und dann Werte zu bekommen, aber wenn es innerhalb Objekts setzen geben Sie es wirft, dass error.Please mich wissen lassen, wie sie zu beheben Dies.

Hinweis: Ich fand Problem in repositoryURL Attribute war, wenn ich Sonderzeichen entfernen : \ aus string i zum Repository werfen kann object.So i wie i URL http://11.11.111.11/ um JSON-Objekt setzen wissen möchte, kann meine sogar obiges Objekt ist gültig Json.

Antwort

1

Die POJO Klasse sollte wie folgt lauten: -

Ich habe nicht alle Felder in der unten angegebenen POJO Klassen enthalten sind. Sie können hinzufügen und versuchen.

ParentConfiguration Klasse: -

public class ParentConfiguration implements Serializable{ 


    private static final long serialVersionUID = -1185592608319193198L; 

    private Configuration configuration; 

    @Override 
    public String toString() { 
     return "ParentConfiguration [configuration=" + configuration + "]"; 
    } 


} 

Configuration-Klasse: -

public class Configuration implements Serializable { 

    @Override 
    public String toString() { 
     return "Configuration [port=" + port + ", URL=" + URL + ", repository=" + repository + "]"; 
    } 

    private static final long serialVersionUID = 8642243843212797330L; 

    private Integer port; 

    private String URL; 



    @SerializedName("Repository") 
    private Repository repository; 

} 

Repository-Klasse: -

public class Repository implements Serializable{ 

    @Override 
    public String toString() { 
     return "Repository [repositoryURL=" + repositoryURL + "]"; 
    } 
    private static final long serialVersionUID = -1891563116357617243L; 
    private String repositoryURL; 

} 

Main-Methode: -

public static void main(String[] args) { 
     String jsonString = "{ \"configuration\": {\"dryRunTest\": {\"id\": null,\"defaultName\": \"sample.xml\",  \"ParamsMap\": null,  \"defaultVersion\": \"1.2\",  \"dryRunTestOn\": true }, \"port\": 2323, \"ip\": \"11.11.11.111\", \"configFile\": \"config.json\", \"Name\": \"007\", \"URL\": \"http://11.111.111.51/ma/api/ag/\", \"Password\": \"123\", \"configDirectory\": \"sss\", \"platform\": \"Windows7\", \"Repository\": {  \"repositoryURL\": \"http://11.11.111.11/\" } }}"; 


     Gson gson = new Gson(); 
     ParentConfiguration parentConfiguration = gson.fromJson(jsonString, ParentConfiguration.class); 
     System.out.println(parentConfiguration.toString()); 
    } 

Ausgang: -

ParentConfiguration [configuration=Configuration [port=2323, URL=http://11.111.111.51/ma/api/ag/, repository=Repository [repositoryURL=http://11.11.111.11/]]] 

Statt Karte umzuwandeln, wenn Sie es als JsonObject analysieren können, das Ergebnis leicht erreichen kann: -

import org.apache.commons.io.IOUtils; 

JsonObject jsonObject= new Gson().fromJson(IOUtils.toString(ParseUrl.class.getResourceAsStream("/configuration.json")), JsonObject.class); 
     Repository respository = gson.fromJson(jsonObject.getAsJsonObject("configuration").get("Repository"), Repository.class); 
     System.out.println(respository); 
+0

Vielen Dank für Ihre reply.I hilft die Post mit mehr Details aktualisiert bitte refer.I werfen wollen 'Repository' object.seems wie Problem' wurde repositoryURL' es einige ungekündigten Werte enthält . – gihan

+0

Eine weitere Möglichkeit zum Parsen und Abrufen des Repository-Objekts wurde hinzugefügt. – notionquest

+0

Danke, dass Sie meine Zeit gespeichert haben.Es funktioniert gut.Nachklärungen gibt es irgendeine Beziehung mit überschreiben 'toString' für JSN Serialisierung und Deserialisierung.oder es ist genug setzen' @ SerializedName' auf Feld.Können Sie bitte erklären, warum mein vorheriger Code Ausnahmen bekam . – gihan

0

Sie können versuchen, die Zeichenfolge in JSON Strin konvertieren g vor dem Konvertieren in ein Objekt über gson. Dies geschieht im Falle einer Karte, wo Sie ein Objekt erhalten, wenn Sie map.get (key) verwenden.

Das Objekt wird keine Anführungszeichen um Schlüssel oder Wert haben.

Während die Konvertierung in Json vor, wird dafür sorgen.

RepositoryJsonStringvalue = mymap.get("Repository"); 
String jsonString = new Gson().toJson(RepositoryJsonStringvalue).toString(); 
Repository r=new Gson().fromJson(jsonString, Repository.class); 

Hoffe, es haben

Verwandte Themen