2013-03-22 208 views
6

我有一個關於正在構建的Web應用程序的問題,我有一個REST服務接收json字符串。將json對象解析爲字符串

JSON字符串是一樣的東西:

{ 
    "string" : "value", 
    "string" : "value", 
    "object" : { 
       "string" : "value", 
       "string" : "value", 
       .... 
       } 
} 

我使用RestEasy的解析它使用傑克遜下面的JSON字符串。我有一個jaxb註釋類,我想將「對象」完全解析爲一個String變量。我想這樣做的原因是能夠稍後使用正確的解析器解析json(這取決於發送請求的應用程序,因此無法預先知道)。

我JAXB註解類看起來是這樣的:

@XmlRootElement 
@XmlAccessorType(XmlAccessType.PROPERTY) 
public class Test{ 

@XmlElement(type = String.class) 
private String object; 

//getter and setter 
... 
} 

當我執行剩下的電話,讓傑克遜解析這個代碼,我得到一個

Can not deserialize instance of java.lang.String out of START_OBJECT token 

錯誤。所以實際上我試圖解析一個json字符串,這是一個json對象,成一個字符串。我似乎無法找到有類似問題的人。

在此先感謝您的任何回覆。

+4

它必須是一個字符串?由於您使用的是傑克遜,我建議將您的對象存儲爲[JsonNode](http://fasterxml.github.com/jackson-databind/javadoc/2.1.0/com/fasterxml/jackson/databind/JsonNode.html)。這應該反序列化就好,你可以用正確的解析器解析它。 – nutlike 2013-03-22 09:58:46

+0

根據我的分析師,它應該是:)。無論如何,我會試試看,如果它有效,我會說服他。 – KwintenP 2013-03-22 10:29:09

回答

0
java.lang.String out of START_OBJECT token 

這意味着預期字符後"object"是報價",但不是括號{

預期JSON

"object" : "my object" 

實際JSON

"object" : { ... 

=======
如果你想解析JSON就像在你的榜樣,那麼改變你類。例如。

@XmlRootElement 
@XmlAccessorType(XmlAccessType.PROPERTY) 
public class Test{ 

    @XmlElement 
    private InnerTest object; 

    //getter and setter 
... 
} 

@XmlAccessorType(XmlAccessType.PROPERTY) 
public class InnerTest{ 

    @XmlElement 
    private String string; 

    //getter and setter 
... 
} 
1

如果我理解這個問題,您只需要一個mechnanism,它將Java對象轉換爲JSON字符串,另一種方式。

我還需要這個,而我正在使用一個JSON字符串傳遞的WebSocket客戶端 - 服務器通信。

爲此我使用了GSON(請參閱GSON)。你有可能創建一個完整的JSON字符串。 這裏是一些例子:

// Converts a object into a JSON-String 
public String convertMyClassObjectToJsonFormat() { 
    MyClass myObject = new MyClass(); 
    Gson gson = new Gson(); 

    return gson.toJson(myObject); 
} 

//Converts a JSON-String into a Java-Class-Object 
public MyClass convertJsonToMyClassObject(
      CharBuffer jsonMessage) { 
    Gson gson = new Gson(); 

    return gson.fromJson(jsonMessage.toString(), 
       MyClass.class); 
} 

你需要的是,您在類屬性的制定者和JSON-屬性,名稱是等價的。例如。

{ 
    "info":[ 
     { 
     "name": "Adam", 
     "address": "Park Street" 
     } 
    ] 
} 

你的等級應該是這樣的:

public class Info{ 
private String name; 
private String address; 

public void setName(String name){ 
    this.name = name; 
} 
public void setAddress(String address){ 
    this.address = address; 
} 
} 
0

你也可以做這樣的事情;

public class LeaderboardView 
{ 
    @NotEmpty 
    @JsonProperty 
    private String appId; 

    @NotEmpty 
    @JsonProperty 
    private String userId; 

    @JsonProperty 
    private String name = ""; 

    @JsonProperty 
    private String imagePath = ""; 

    @NotEmpty 
    @JsonIgnore 
    private String rank = ""; 

    @NotEmpty 
    @JsonProperty 
    private String score; 

    public LeaderboardView() 
    { 
     // Jackson deserialization 
    } 

}

1

@KwintenP嘗試使用json smart library

然後,您可以簡單地檢索JSON對象首次使用:

JSONObject test = (JSONObject) JSONValue.parse(yourJSONObject); 
String TestString = test.toString(); 

更重要的是,你可以檢索JSON對象中的特定對象可能它是另一個對象,數組並將其轉換爲一個字符串或操縱你想要的方式。