【问题标题】:Java JSON backslash added to JSON responseJava JSON 反斜杠添加到 JSON 响应
【发布时间】:2014-10-14 07:19:42
【问题描述】:

为什么会出现这些反斜杠以及在浏览器向客户端显示 json 数据时如何删除它们?

如果那些反斜杠不存在,o/p json 响应似乎是有效的

testbookdata.xml

<Users>
    <User>
        <Name>Unni</Name>
        <Books>
            <Book>book1</Book>
            <Book>book2</Book>
            <Book>book3</Book>
        </Books>
    </User>
    <User>
        <Name>Ammu</Name>
        <Books>
            <Book>book1</Book>
            <Book>book2</Book>
            <Book>book4</Book>
        </Books>
    </User>
</Users>

这个 xml 通过 org.json 库转换为 JSONObject

org.json.JSONObject xmlJSONObj = XML.toJSONObject(booksXMLString);

最后,我有一个类可以告诉在特定用户请求中要转换为 JSON 的所有内容,

类的一个属性:

@JsonInclude(Include.NON_NULL)
@JsonProperty(value = "jsondata")
public String getJson() {
    return json.toString();
}

如果我只是打印数据,

json data : ...
{"Users":{"User":[{"Name":"Unni","Books":{"Book":["book1","book2","book3"]}},{"Name":"Ammu","Books":{"Book":["book1","book2","book4"]}}]}}

最后是带有public @ResponseBody注解的webservice控制器方法 调用服务并返回具有@Json 注释的对象

问题:

结果被浏览器显示出来的时候是这样的——

"jsondata": "{\"Users\":{\"User\":[{\"Name\":\"Unni\",\"Books\":{\"Book\":[\"book1\",\"book2\",\"book3\"]}},{\"Name\":\"Ammu\",\"Books\":{\"Book\":[\"book1\",\"book2\",\"book4\"]}}]}}"
}

如何解决这个问题?

谢谢!

注意:我添加了 spring-mvc 标签,因为@ResponseBody 是 spring-web 的一部分

更新 1:

再次尝试@Jon Skeet 提到的内容,但出现错误,

org.springframework.http.converter.HttpMessageNotWritableException: Could not write JSON: 
No serializer found for class org.json.JSONObject and no properties discovered to create 
BeanSerializer (to avoid exception, disable SerializationConfig.SerializationFeature.FAIL_ON_EMPTY_BEANS) ) 
(through reference chain: com.ht.Result["jsondata"]);
 nested exception is com.fasterxml.jackson.databind.JsonMappingException: 
 No serializer found for class org.json.JSONObject and no properties discovered 
 to create BeanSerializer (to avoid exception, disable SerializationConfig.SerializationFeature
 .FAIL_ON_EMPTY_BEANS) )

【问题讨论】:

  • 您基本上是在说您想将getJson() 的结果编码为属性jsondata 的值——这正是您所拥有的。只是 jsondata 已经是 JSON 了……也许你应该只是返回 xmlJSONObj
  • 谢谢,但我实际上一开始尝试过,导致错误提示无法解析 JSONObject。我用错误更新了我的帖子

标签: java json spring spring-mvc


【解决方案1】:

据我了解,你有

class SomePojo {
    public JSONObject json;
    @JsonInclude(Include.NON_NULL)
    @JsonProperty(value = "jsondata")
    public String getJson() {
        return json.toString();
    }
}

@ResponseBody
@RequestMapping(..)
public SomePojo getPojo() {
    SomePojo pojo = ...;
    return pojo;
}

上面的模型基本上是说你有一个 JSON 对象,其中包含一个名称-值对。名称为 jsondata,值为 JSON 字符串。由于您的 String 值包含 JSON 字符串中不可接受的字符,因此必须在序列化值中对其进行转义。

但您似乎想要一个 JSON 对象,其中包含名称为 jsondata 且值是另一个 JSON 对象的名称-值对。

你可能想拥有

@JsonRawValue
@JsonInclude(Include.NON_NULL)
@JsonProperty(value = "jsondata")
public String getJson() {
    return json.toString();
}

因此String 值按原样使用,而不是转换为 JSON 字符串。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-06-14
    • 2018-12-02
    • 2019-10-16
    • 2017-06-08
    • 2021-07-30
    • 1970-01-01
    相关资源
    最近更新 更多