我有一个关于我正在构建的Web应用程序的问题,其中我有一个接收json字符串的REST服务。
Json字符串类似于:
{
"string" : "value",
"string" : "value",
"object" : {
"string" : "value",
"string" : "value",
....
}
}
我正在使用resteasy来解析使用下面的jackson的json字符串。我有一个jaxb注释类,我想将“对象”完全解析为String变量。我想这样做的原因是以后能够使用正确的解析器解析json(它取决于发送请求的应用程序,因此事先无法知道)。
我的jaxb注释类看起来像这样:
@XmlRootElement
@XmlAccessorType(XmlAccessType.PROPERTY)
public class Test{
@XmlElement(type = String.class)
private String object;
//getter and setter
...
}
当我执行其余的调用并让jackson解析这段代码时,我得到了一个
Can not deserialize instance of java.lang.String out of START_OBJECT token
错误。所以实际上我正在尝试将一个json字符串(一个json对象)解析成一个String。我似乎找不到有类似问题的人。
提前感谢您的回复。
答案 0 :(得分:1)
如果我理解这个问题,你只需要一个mechnanism,将Java-Object转换为JSON-String,反之亦然。
我也需要这个,而我正在使用WebSocket客户端 - 服务器通信,其中传递了JSON字符串。
为此,我使用了GSON(见GSON)。在那里,您可以创建完整的JSON-String。 这里有一些例子:
// 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);
}
您需要的是,您的Class-Attributes-setter和JSON-Attribute-names是等效的。 E.g。
{
"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;
}
}
答案 1 :(得分:1)
@KwintenP尝试使用json smart library。
然后,您可以使用以下命令简单地检索JSON对象:
JSONObject test = (JSONObject) JSONValue.parse(yourJSONObject);
String TestString = test.toString();
此外,您可以检索JSON对象中的特定对象,可能是另一个对象,数组并将其转换为String或操纵您想要的方式。
答案 2 :(得分: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
...
}
答案 3 :(得分: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
}
}