2013-03-22 204 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对象中的特定对象可能它是另一个对象,数组并将其转换为一个字符串或操纵你想要的方式。