【问题标题】:Convert Java object to json string containing a json string property already将 Java 对象转换为已包含 json 字符串属性的 json 字符串
【发布时间】:2022-01-11 08:32:07
【问题描述】:

考虑如下 Java 对象:

class User {

  String name;

  int age;

  String locationJson; // this is a json already

  //allArgsConstructor, getters & setters
}

所以当我们这样做时,

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

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

new ObjectMapper().writeValueAsString(user)), String.class);

我期待的是这样的:

{
  "name": "Max",
  "age": "13",
  "locationJson": {"latitude":30.0000, "longitude":32.0000}
}

相反,我将它作为一个 json 值 用双引号括起来用反斜杠跳过,因为它是双 jsonized - 如果这实际上是一个动词 -

{
  "name": "Max",
  "age": "13",
  "locationJson": "{\"latitude\":30.0000, \"longitude\":32.0000}"
}

【问题讨论】:

    标签: java json spring jackson objectmapper


    【解决方案1】:

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

    从文档 https://fasterxml.github.io/jackson-annotations/javadoc/2.5/com/fasterxml/jackson/annotation/JsonRawValue.html 中,它声明了以下内容:

    标记注释,指示注释的方法或字段应按原样包含属性的字面字符串值来序列化,而不用引用字符。这对于注入已经在 J​​SON 中序列化的值或将 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
    }
    

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

    {
      "name": "Max",
      "age": "13",
      "locationJson": {"latitude":30.0000, "longitude":32.0000}
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-08-30
      • 1970-01-01
      • 1970-01-01
      • 2021-09-18
      • 1970-01-01
      • 2017-03-24
      • 2019-08-27
      • 2020-05-27
      相关资源
      最近更新 更多