我从服务器获得了这样的JSON:
{
"id":"1",
"value":13,
"text":"{\"Pid\":\"2\",\"value\":42}"
}
我使用jackson库使用以下代码将此JSON字符串反序列化为java对象:(示例如下)
ObjectMapper mapper = new ObjectMapper();
MapObj obj = mapper.readValue(JSONfromServerInString, MapObj.class);
Map Object看起来像这样:
public class MapObj {
@JsonProperty("id")
private Integer id;
@JsonProperty("value")
private Integer value;
@JsonProperty("text")
private String text;
public Integer getId() {return id;}
public void setId(Integer id) {this.id = id;}
public Integer getValue() {return value;}
public void setValue(Integer value) {this.value = value;}
public String getText() {return text;}
public void setText(String text) {this.text = text;}
}
但是当我尝试在引号前用反斜杠反序列化这个String时。杰克逊解串者似乎在他找到字符串的第一个结尾时结束。他忽略了反斜杠。所以这个例子将输出:
org.codehaus.jackson.JsonParseException:意外字符('P'(代码80)):期待逗号分隔OBJECT条目 在[来源:java.io.StringReader@2f7c7260; line:1,column:33]
(('P'(代码80))代表原始JSON字符串中的P字符\“Pid \”)
答案 0 :(得分:3)
你确定它不起作用吗?这个测试工作正常:
import com.fasterxml.jackson.annotation.JsonProperty;
import com.fasterxml.jackson.databind.ObjectMapper;
import java.io.IOException;
public class Test {
public static void main(String[] args) throws IOException {
ObjectMapper objectMapper = new ObjectMapper();
String json = "{\n" +
" \"id\":\"1\",\n" +
" \"value\":13,\n" +
" \"text\":\"{\\\"Pid\\\":\\\"2\\\",\\\"value\\\":42}\"\n" +
"}";
MapObj mapObj = objectMapper.readValue(json, MapObj.class);
System.out.println("text = " + mapObj.getText());
}
private static class MapObj {
@JsonProperty("id")
private Integer id;
@JsonProperty("value")
private Integer value;
@JsonProperty("text")
private String text;
public Integer getId() {return id;}
public void setId(Integer id) {this.id = id;}
public Integer getValue() {return value;}
public void setValue(Integer value) {this.value = value;}
public String getText() {return text;}
public void setText(String text) {this.text = text;}
}
}
打印:
text = {"Pid":"2","value":42}
使用Jackson 2.6.4
答案 1 :(得分:0)
看起来服务器正在将“text”映射转换为字符串,然后在响应中返回它。是否可以在服务器端进行更改以将Map作为一个整体发送,以便正确地完成Map的序列化?
据我所知,Jackson默认情况下无法将字符串反序列化为Map。
答案 2 :(得分:-1)
所以我找到了解决方案。
JSONfromServerInString.replace("\\", "\\\\\\");
现在似乎正在运作。我发现你需要插入三次反斜杠才能使其正常工作。
所以工作字符串应该是这样的:
{
"id" : "1",
"value":13,
"text":"{\\\"Pid\\\":\\\"2\\\",\\\"value\\\":42}"
}
我在这里找到了解决方案:
How do you replace double quotes with a blank space in Java?