5

是否有注释或其他方式告诉杰克逊序列化不带引号的字符串变量的值。序列化程序应该只序列化不带引号的一个字段的值。

我正在寻找类似于以下内容的回报:

{"name": "nameValue", "click" : function (e){console.log("message");}}

代替

{"name": "nameValue", "click" : "function (e){console.log("message");}"}

以上是外部 java 脚本库如何需要数据,所以如果没有办法,我将不得不在 Object Mapper 将字符串转换为 JSON 后手动更改字符串。

4

3 回答 3

12

正如其他人指出的那样,双引号在 JSON 中不是可选的,而是强制性的。

话虽如此,您可以使用注释JsonRawValue来做您想做的事情。

public class POJO {
  public String name;
  @JsonRawValue
  public String click;
}
于 2013-08-14T05:36:04.630 回答
5

好吧,从技术上讲,你可以做到。虽然结果不是有效的 JSON,但杰克逊仍然可以:

class Dto  {
    @JsonProperty("name")
    String foo = "nameValue";
    @JsonProperty("click")
    JsEntry entry = new JsEntry("function (e){console.log(\"message\");}");
}

class JsEntry implements JsonSerializableWithType {
    private String value;

    JsEntry(String value) {
        this.value = value;
    }

    @Override
    public void serializeWithType(JsonGenerator jgen, SerializerProvider provider, TypeSerializer typeSer) throws IOException {
        this.serialize(jgen, provider);
    }

    @Override
    public void serialize(JsonGenerator jgen, SerializerProvider provider) throws IOException {
        jgen.writeRawValue(value);
    }
}

但是,我完全同意此要求会导致违反标准,应予以修订。

于 2013-08-10T17:49:03.857 回答
3

不是有效的 JSON,所以你不能拥有它。JSON 是一种值传输格式,因此您不能传输函数。

如果您确实需要以 JSON 格式返回函数,您可能可以在 javascript 中对结果进行后处理。

于 2013-08-10T17:24:49.010 回答