【问题标题】:Java Jersey JSON service doesn't return quoted string?Java Jersey JSON 服务不返回带引号的字符串?
【发布时间】:2018-03-14 02:51:36
【问题描述】:

这是一个使用 Jersey 编写的简单 Web 服务

@GET
@Produces(MediaType.APPLICATION_JSON)
public Object interpretationJson() {                        
    String o = "a simple string";       
    return o;
}

对此的回应是:

HTTP/1.1 200
Content-Type: application/json
Content-Length: 15
Date: Mon, 02 Oct 2017 23:18:14 GMT

a simple string

响应正文中的字符串不应该被引用吗?我不相信这是有效的 JSON。响应不应该是:

HTTP/1.1 200
Content-Type: application/json
Content-Length: 15
Date: Mon, 02 Oct 2017 23:18:14 GMT

"a simple string"

这让我有点困惑。我原本以为问题出在客户端,但现在我认为问题是从 Jersey 返回的字符串不是有效的 JSON - C# Parsing json that may have simple types

【问题讨论】:

  • 为什么?要获得带引号的字符串,请转义并添加另一组引号。如果您将返回一个正确的 json,而不仅仅是字符串,那么字段的值将被正确引用
  • 序列化程序应该正确序列化返回的对象。不带引号的字符串不是有效的 JSON。这是一个简化的例子。在实际代码中,对象“o”有时是一个简单的字符串,但有时是一个更复杂的对象。

标签: java json jersey


【解决方案1】:
public class TestGetterSetter{

private String name ;

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


public String getName(String name){
    return this.name ;
}}

使用这个POJO类设置值并返回这个POJO类对象

【讨论】:

    【解决方案2】:

    这里引用了 Jackson 的开发人员 (Tatu Saloranta / cowtowncoder) 关于为什么以这种方式处理简单字符串的引述。

    这不是 String 被声明为不可触摸的原因。相反,选择是 之间:

    将输入字符串写为 JSON 字符串,即用双引号括起来 并转义必要的字符,或

    完全按原样编写字符串,假设用户想要完全生成该字符串 输出(可能是手动编码的 JSON)。

    由于没有元数据来说明用户的意图,杰克逊是 保守并使用后一种选择。 考虑到 JSON 规范仅考虑 JSON 对象和 JSON 数组作为有效的 JSON 内容——严格来说, 返回 JSON 字符串无论如何都会产生无效的 JSON。

    Referenced issue...

    “Untouchable”是 Jackson 对将按原样返回的类型的术语。

    如果你愿意,你可以很容易地返回一个带引号的字符串,并且有几种方法可以做到这一点。但这不是你的问题,我想。

    【讨论】:

    • 谢谢。有没有推荐的方法将不可触摸的字符串用引号括起来?或者类似于以下内容是否足够好: Object o = getObjectFromSomewhere(); if (o instanceof String) { String s = String.format("\"%s\"", (String)o);返回 s; } 其他 { 返回 o; }
    猜你喜欢
    • 1970-01-01
    • 2012-09-10
    • 2018-09-10
    • 2023-03-23
    • 1970-01-01
    • 2016-02-14
    • 1970-01-01
    • 2016-07-26
    • 1970-01-01
    相关资源
    最近更新 更多