2016-11-09 128 views
0

我已經使用Gson創建了一個Json字符串,這是有效的。我使用下面的方法創建了Json對象。當把Json字符串轉換爲對象時,Gson malformedJsonException

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/" 
    } 
    } 
} 

我試圖創建使用Repository Json字符串的Repository對象,如下所示。

class Repository{ 
String repositoryURL; 
getter and setters 
} 

然後我使用淡化序列化JSON對象,

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

RepositoryJsonStringvalue = mymap.get("Repository"); 

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

它返回以下異常。

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

好像問題是與它的價值repositoryURL但我把相同的值到另一個頂級屬性URL=http://11.11.111.11/,然後可以得到的值,但是當它把裏面的物體鍵入它拋出error.Please讓我知道如何解決這個。

注意:我發現問題是repositoryURL屬性,如果我從字符串中刪除特殊字符: \我可以同時投射到庫object.So我想知道我怎麼可以把URL http://11.11.111.11/中JSON對象,甚至我的上面的對象是有效的Json。

回答

1

POJO類應該如下: -

我沒有包含在以下POJO類的所有字段。你可以包括並嘗試。

ParentConfiguration類: -

public class ParentConfiguration implements Serializable{ 


    private static final long serialVersionUID = -1185592608319193198L; 

    private Configuration configuration; 

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


} 

配置類: -

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; 

} 

庫類: -

public class Repository implements Serializable{ 

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

} 

主要方法: -

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

輸出: -

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

而是轉換成地圖,如果你可以解析它的JSONObject的,你可以很容易達到的效果: -

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

感謝您reply.I已經更新了更多的細節後請refer.I要轉換爲'Repository' object.seems像問題'repositoryURL'它包含了一些未終止值。 – gihan

+0

增加了解析和獲取存儲庫對象的另一種方法。 – notionquest

+0

謝謝你保存我的time.it工作fine.few澄清是否有任何與重寫'toString'爲Json序列化和反序列化的關係,或者足夠把'@ SerializedName'放在field.c中,請你解釋爲什麼我以前的代碼有異常。 – gihan

0

您可以嘗試將字符串轉換爲json條碼g之後通過gson將其轉換爲對象。 如果您使用map.get(key),您會得到一個對象的地圖會發生這種情況。

該對象不會在引號或值附近引用「」。

在轉換到json之前,會確保。

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

希望它可以幫助