Java Jersey的JSON服务为什么没有返回带引号的字符串?

4

这是一个使用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#解析可能包含简单类型的JSON


为什么?为了得到一个带引号的字符串,需要转义并添加另一组引号。如果你返回一个正确的 JSON 而不仅仅是字符串,那么字段的值将被正确地加上引号。 - Optional
序列化程序应正确地序列化返回的对象。不带引号的字符串不是有效的JSON格式。这只是一个简化的例子。在实际代码中,对象“o”有时是一个简单的字符串,但有时是一个更复杂的对象。 - Michael Levy
2个回答

4
这是一篇关于为什么简单字符串被处理成这样的Jackson开发者(Tatu Saloranta / cowtowncoder)的文章。
引用原话如下: 这不是String声明为untouchable的原因。而是在以下两者中选择: 1. 将输入的String写成JSON String,即用双引号括起来并转义必要的字符 2. 写出完全相同的String,假设用户希望生成这个输出(假定是手动编码的JSON)。
由于没有元数据告诉我们用户的意图,Jackson采取了保守的方式,使用后者。 考虑到JSON规范只将JSON对象和JSON数组视为有效的JSON内容,所以严格来说,返回JSON字符串会产生无效的JSON。
“Untouchable”是Jackson用来描述类型将会完全返回原样的术语。
如果你想要返回带引号的字符串,你可以很容易地实现,但我想这不是您的问题。 参考问题...

谢谢。有没有推荐的方法将不可改变的字符串用引号括起来?或者像下面这样做是否足够好: Object o = getObjectFromSomewhere(); if (o instanceof String) { String s = String.format(""%s"", (String)o); return s; } else { return o; } - Michael Levy

-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类对象

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接