Сохранить пробел в ключах JSON - PullRequest
       7

Сохранить пробел в ключах JSON

1 голос
/ 23 сентября 2019

Пробелы в ключах scala не сохраняются

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

Запрос полезной нагрузки

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

При использовании этого класса case в коде после преобразования из gson в Json он становится

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

1 Ответ

1 голос
/ 24 сентября 2019

Я не пробовал gson для обработки JSON.Я использую Play JSON play.api.libs.json framework.

В 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)

и используйте gson FieldNamingPolicy, чтобы получить правильное форматирование при сборке JSON.Вы можете создать конструктор 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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...