【问题标题】:Serialize String without escape " to \"序列化字符串而不转义“到\”
【发布时间】:2017-05-27 06:24:14
【问题描述】:

我想为我的 restful web 服务导出一个 json 字符串。

我的班级看起来像:

public class Animal {
  private String name;
  private JsonElement additionalProperties; //generated with gson
  private String additionalProperties2; //same as above but direct from db
}

additionalProperties 是 db 中的 Json 字段,以 String 形式返回给 Java。想法是,每一种动物都可以拥有自己的特殊属性和任何类型的数据结构,而无需在 Java 端对其进行建模。

当我尝试导出时,使用 gson。

 List<Animal> animals = database.getAllAnimals(); //simplified
 return gson.toJson(animals); // in real via javax.ws.rs.core.Response

我的问题是输出看起来像:

[
  {"name": "Mia", 
   "additionalProperties: "{\"race\": \"dog\"}",
   "additionalProperties2: "{\"race\": \"dog\"}"},
  {...} ...
]

相反,我想要:

[
  {"name": "Mia", 
   "additionalProperties: {"race": "dog"}"
  {...} ...
]

我已经尝试在没有附加属性的情况下构建 JsonObjects 并使用“添加属性”来添加附加属性。但是输出是一样的。我想问题是Java字符串序列化。 DB 输出是正确的。 additionalProperties 是一个没有编码的普通字符串。

我看到了杰克逊的财产@JsonRawValue。这是如何运作的?我也可以用 gson 做这个吗?

【问题讨论】:

  • 如何将 JSON 属性解析为 Map (或 Map 如果 JSON 只应该包含字符串属性),并将其用作附加属性?
  • 两者都不是有效的 JSON。
  • additionalProperties 也可以是一个列表或包含子元素和子列表。
  • 只是想知道:你为什么需要它?附: Gson 不允许产生非法的 JSON 文档。
  • 它是一个特殊的微服务,其他服务可以在其中创建事件。一些事件有额外的数据并且想要存储它们。所以我在数据库中创建了一个 json 字段,并允许用户将 abritoty json 对象添加到事件中。

标签: java json serialization gson


【解决方案1】:

首先,您的JsonElement 应该可以正常工作,所以可能是您创建的方式错误。

其次,要输出一个包含 JSON 文本的 String 值,不转义,可以使用 @JsonAdapterjsonValue(String value)

直接将value 写给作者,无需引用或转义。

显示两者的示例代码:

public class Test {
    public static void main(String[] args) throws Exception {
        String jsonTextFromDb = "{\"race\": \"dog\"}";

        JsonElement additionalProperties = new JsonParser().parse(jsonTextFromDb);
        Animal animal = new Animal("Mia", additionalProperties, jsonTextFromDb);

        Gson gson = new GsonBuilder().setPrettyPrinting().create();
        System.out.println(gson.toJson(animal));
    }
}

class Animal {
    private String name;
    private JsonElement additionalProperties;
    @JsonAdapter(JsonTextAdapter.class)
    private String additionalProperties2;
    Animal(String name, JsonElement additionalProperties, String additionalProperties2) {
        this.name = name;
        this.additionalProperties = additionalProperties;
        this.additionalProperties2 = additionalProperties2;
    }
}

class JsonTextAdapter extends TypeAdapter<String> {
    @Override
    public void write(JsonWriter out, String str) throws IOException {
        out.jsonValue(str);
    }
    @Override
    public String read(JsonReader in) throws IOException {
        return new JsonParser().parse(in).toString();
    }
}

输出

{
  "name": "Mia",
  "additionalProperties": {
    "race": "dog"
  },
  "additionalProperties2": {"race": "dog"}
}

【讨论】:

  • 完美运行!谢谢
猜你喜欢
  • 2014-03-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-11-19
  • 2011-01-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多