杰克逊字段值没有引号

时间:2013-08-10 17:17:12

标签: java json annotations jackson

是否有注释或其他方式告诉Jackson在没有引号的情况下序列化String变量的值。序列化程序只应序列化一个字段的值而不带引号。

我正在寻找类似于:

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

而不是

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

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

3 个答案:

答案 0 :(得分:10)

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

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

public class POJO {
  public String name;
  @JsonRawValue
  public String click;
}

答案 1 :(得分: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);
    }
}

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

答案 2 :(得分:2)

那是not valid JSON,所以你不能拥有它。 JSON是一种值传输格式,因此您无法传输函数。

如果你真的需要在JSON中返回函数,你可以在javascript中对结果进行后处理。