在JSON键中保留空白

时间:2019-09-23 15:08:05

标签: scala gson

scala键中的空白不保留

case class c1(
  state :String,
  `Card No`:String
)

请求有效载荷

{
  "state": "HH",
  "Card No": "c1234",
  "xxxx": "xxxx"
}

从gson转换为Json后在代码中使用case类时 它变成

{"state":"HH","Card$u0020No":"c1234","xxx":"xxx"}

1 个答案:

答案 0 :(得分:3)

我还没有尝试gson进行JSON处理。我使用Play JSON play.api.libs.json框架。

以下内容可用于播放JSON:

import play.api.libs.json._

case class MyClass(State: String, `Card No`: String)

// Play can convert any case class into a JsValue, using macros.
// you will need an implicit `Writes` for `MyClass`
implicit private val MyClassWrites = Json.writes[MyClass]

val myobj = MyClass(State = "Bangalore", `Card No` = "Bl@#1234")

val json = Json.toJson(myobj)

println(json)

给出以下JSON:

{"State":"Bangalore","Card No":"Bl@#1234"}

一旦我签出gson lib,将更新此内容。

更新:使用Gson

我希望您没有用反引号定义案例类的值,而是使用标准格式-可能是驼峰式的案例。这将有助于保持代码更清洁。 如下所示:

case class MyClassA (state: String, cardNo: String)

,并在构建JSON时使用gson FieldNamingPolicy获得正确的格式。 您可以创建一个gson生成器并执行类似的操作

val status = MyClassA(State = "Bangalore", cardNo = "Bl@#1234")

val gson = new GsonBuilder()
    .setFieldNamingPolicy(FieldNamingPolicy.UPPER_CAMEL_CASE_WITH_SPACES)
    .setPrettyPrinting().create()

println(gson.toJson(status))

FieldNamingPolicy.UPPER_CAMEL_CASE_WITH_SPACES将确保字段名称的第一个字母在序列化为JSON格式时首字母大写,并且单词之间将用空格分隔。

上面将产生以下JSON。

{
  "State": "Bangalore",
  "Card No": "Bl@#1234"
}

此外,您可以在任何字段名称上使用@SerializedName批注来指定序列化名称。

使用注释 使用SerializedName如下:

case class MyClassA (
    State: String, 
    @(SerializedName @scala.annotation.meta.field)("card no")
    cardNo: String
    )

您需要使用scala.annotation.meta中的元注释。请参阅此git issue