Json анализировать динамический c объект от клиента с использованием библиотеки json по умолчанию - PullRequest
0 голосов
/ 18 июня 2020

Хорошо, я пробовал несколько способов, но ничего не работает или ничего не выглядит лучшим вариантом.

У меня есть клиентский объект (angular) как:

export class SavedSheet {
  workspaceId: number;
  newRows: [any[]];
  updatedRows: UpdatedRow[];
  deletedRows: number[];
}

newRows (json) будет выглядеть так:

newRows:[
  ["-1", "123123"],
  ["-2", "sadasd"]
]

, и я пытаюсь отправить его в свой Scala Play! api как класс case, который выглядит так:

case class SavedSheet(workspaceId: Int,
                      newRows: List[List[String]] // String will work, but I need to use Any/Object type
                      updatedRows: List[UpdatedRow],
                      deletedRows: List[Int])

object SavedSheet {    
  implicit val read = Json.reads[SavedSheet]
  implicit val write = Json.writes[SavedSheet]    
  def tupled = (SavedSheet.apply _).tupled
}

    // db table example
    ------------------------
    | row_id | ColA | ColB |
    ------------------------
    |    1   | val2 | val3 |
    ------------------------
    |    2   | val8 | val9 |

Это таблица Dynami c db, в которой я сохраняю эти данные. Я не знаю, сколько столбцов и каких типов будет в этой таблице. Что я знаю, так это то, что первое значение всегда будет ссылаться на столбец "row_id" в качестве идентификатора.

Использование newRows: List[List[String]] будет работать нормально, потому что, наконец, я вычислю запрос как:

INSERT INTO table_name
VALUES (newRows[0], newRows[1], newRows[2], ...)

и тип не имеет большого значения (все значения могут находиться между афострофами как строковые значения, и запрос будет выполнен нормально, даже если значение является числом).

Но, как правило, Я хочу использовать тип Any или Object вместо String, потому что список значений имеет разные типы: newRows: List[List[Any]] или newRows: List[List[Object]]

Проблема в том, что библиотека play.api.libs.json не может анализировать тип Any / Object. В качестве идеи я могу написать неявный val в объекте-компаньоне, который считывает ключи / значения? Даже при этом мне нужно проанализировать значение внутри моей службы.

Для других случаев я использую JsObject, но для случаев с массивами у меня нет ключа. Я могу создать его и обновить тело моего клиента, и массив станет примерно таким:

newRows: [
  { key1: "[-1,"123123"]" },
  { key2: "[-2,"sadasd"]" }
]

Этот случай будет правильно работать с использованием newRows: List[JsObject], потому что каждый JsObject переводится как ключ (строка) и значение (массив). Но я хочу знать, можно ли напрямую использовать значения как Any или Object

Спасибо

...