Получение json из массива json, полученного с url-адреса - PullRequest
0 голосов
/ 01 августа 2020

Я работаю над приложением scala. Я новичок в этом, поэтому пробую кое-что. У меня есть URL-адрес, и я получаю его ответ из приведенного ниже кода

val results = scala.io.Source.fromURL(url).mkString

Это даст результат в следующем формате.

[
  {
     "id": "1",
    "formatType": "text"
     "value": [
     {
     "attributes":[{
        "name": "David"
      }],
     "Time": "2020-07-31T10:30:30" 
     }
     ],
  },
  {
    "id": "2",
     "formatType": "text"
     "value": [
     {
     "attributes":[{
        "name": "Raj"
      }],
     "Time": "2020-07-31T10:30:30" 
     }
     ]
  },
  {
    "id": "3",
    "formatType": "text"
    "value": [
     {
     "attributes":[{
        "name": "jhonny"
      }],
     "Time": "2020-07-31T10:30:30" 
     }
     ]
  }
]

Теперь я хочу извлечь полный json, когда Id соответствует. Предположим, когда я получаю идентификатор как 2, я хочу получить только

{
    "id": "2",
     "formatType": "text"
     "value": [
     {
     "attributes":[{
        "name": "David"
      }],
     "Time": "2020-07-31T10:30:30" 
     }
     ]
  }

Если идентификатор равен 3, то я хочу получить только 3-й. Для этого я попробовал следующий код

 def parseJson(jsonString : String) : Review = {
    val jsonResp = Json.parse(jsonString)
    val id = (jsonResp \\ "id")(0).toString()
    val formatType = (jsonResp \\ "formatType")(0).toString()
    val value = (jsonResp \\ "value")(0).toString()

    Review(id, formatType, value)

    if (Review.id == "1") 
    Review

  }

Моя модель выглядит следующим образом

case class Review(
id: String,
formatType: FormatType,
value: Seq[Values]
)

теперь в Review(id, formatType, value), когда я пытаюсь поместить formatType и value в Review, intellij показывает ошибка как formatType, так и значения соответственно

for formatType error is = Type mismatch, expected FormatType.FormatType,actual JsValue
for value error is = Type mismatch, expected Seq[Values],actual Seq[JsValue]

Поскольку я новичок в scala, не знаю, как ее решить. Как я могу указать правильные типы в моем коде. Пожалуйста, предложите. Или есть лучший способ получить json на основе идентификатора, тогда тоже предложите это.

1 Ответ

0 голосов
/ 02 августа 2020

Предполагается, что вы используете Play JSON и определения FormatType и Values, как показано ниже.

import play.api.libs.json._

final class FormatType(val code: String) extends AnyVal

case class Value(
  attributes: Seq[Map[String, String]],
  Time: String)

case class Review(
  id: String,
  formatType: FormatType,
  value: Seq[Value]
)

object Review {
  private implicit val formatTypeFormat: Format[FormatType] =
    Json.valueFormat[FormatType]

  private implicit val valueFormat: OFormat[Value] =
    Json.format[Value]

  implicit val reviewFormat: OFormat[Review] = Json.format[Review]
}

Тогда:

val input = """{
  "id": "1",
  "formatType": "text",
  "value": [
    {
      "attributes":[{
        "name": "David"
      }],
      "Time": "2020-07-31T10:30:30" 
    }
  ]
}"""

Json.parse(input).validate[Review]
# => res0: play.api.libs.json.JsResult[Review] = JsSuccess(Review(1,FormatType@36452d,Vector(Value(Vector(Map(name -> David)),2020-07-31T10:30:30))),)

Примечание: Ваш ввод JSON недействителен (отсутствует запятая).

Анализ из JSON не может дать T, а только JsResult, так как он может быть успешным с анализируемым значением (JsSuccess(t)) или не удалось (JsError).

val input = """[{
  "id": "1",
  "formatType": "text",
  "value": [
    {
      "attributes":[{
        "name": "David"
      }],
      "Time": "2020-07-31T10:30:30" 
    }
  ]
}]"""

Json.parse(input).validate[Seq[Review]]
// res1: play.api.libs.json.JsResult[Seq[Review]] = JsSuccess(Vector(Review(1,FormatType@36452d,Vector(Value(Vector(Map(name -> David)),2020-07-31T10:30:30)))),)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...