将 Java 对象转换为包含 json 字符串属性的 json 字符串

You*_*ans 2 java spring json jackson objectmapper

考虑如下 Java 对象:

class User {

  String name;

  int age;

  String locationJson; // this is a json already

  //allArgsConstructor, getters & setters
}
Run Code Online (Sandbox Code Playgroud)

所以当我们这样做时

import com.fasterxml.jackson.databind.ObjectMapper;
....

User user = new User("Max", 13, "{\"latitude\":30.0000,\"longitude\":32.0000}");

new ObjectMapper().writeValueAsString(user)), String.class);
Run Code Online (Sandbox Code Playgroud)

我期待类似的事情:

{
  "name": "Max",
  "age": "13",
  "locationJson": {"latitude":30.0000, "longitude":32.0000}
}
Run Code Online (Sandbox Code Playgroud)

相反,我将它作为一个 json 值包裹在双引号中,并用反斜杠跳过,因为它是双 json 化的- 如果这实际上是一个动词 -

{
  "name": "Max",
  "age": "13",
  "locationJson": "{\"latitude\":30.0000, \"longitude\":32.0000}"
}
Run Code Online (Sandbox Code Playgroud)

You*_*ans 5

我设法通过使用克服了这个问题@JsonRawValue

从文档https://fasterxml.github.io/jackson-annotations/javadoc/2.5/com/fasterxml/jackson/annotation/JsonRawValue.html它指出以下内容:

标记注释,指示应通过按原样包含属性的文字 String 值来序列化带注释的方法或字段,而不引用字符。这对于注入已在 JSON 中序列化的值或将 javascript 函数定义从服务器传递到 javascript 客户端非常有用。警告:根据您的输入值,生成的 JSON 流可能无效。

所以通过这样做,

import com.fasterxml.jackson.annotation.JsonRawValue;
....
class User {

  String name;

  int age;

  @JsonRawValue
  String locationJson; // this is a json already

  //allArgsConstructor, getters & setters
}
Run Code Online (Sandbox Code Playgroud)

我有点告诉杰克逊,这是一个 json 值,已经不能完成你的工作了,所以帖子中的相同代码生成了正确的 json

{
  "name": "Max",
  "age": "13",
  "locationJson": {"latitude":30.0000, "longitude":32.0000}
}
Run Code Online (Sandbox Code Playgroud)