2015-11-18 9 views
1

У меня есть JSON структура:преобразование JSON вложенного массива

{ 
    "date": "2015-01-01", 
    "id": 100, 
    "movies":[ 
    { 
     "id": 1, 
     "length": 131, 
     "timestamp": 1447837200 
    }, 
    { 
     "id": 2, 
     "length": 131, 
     "timestamp": 1447840800 
    } 
] 
} 

мне нужна проверка: - "дата" является действительной датой; - «id» - это номер в настоящем списке; - «фильмы» - это список объектов;

И трансформация: - «метка времени» - Разбираем unixtimestamp в строку даты (HH: мм)

мне нужно поставить «дата» и «идентификатор» от корня к каждому элементу массива

Таким образом, результат объект:

[ 
    { 
     "id": 1, 
     "length": 131, 
     "timestamp": "09:00", 
     "parent_id": 100, 
     "date": "2015-01-01" 
    }, 
    { 
     "id": 2, 
     "length": 131, 
     "timestamp": "10:00", 
     "parent_id": 100, 
     "date": "2015-01-01" 
    } 
] 

я написал некоторый код, ведьма преобразовать метку времени, но это выглядит ужасно ..

val inputJson = play.api.libs.json.Json.parse(
    """{ 
    "date": "2015-01-01", 
    "id": 100, 
    "movies":[ 
    { 
     "id": 1, 
     "length": 131, 
     "timestamp": 1447837200 
    }, 
    { 
     "id": 2, 
     "length": 131, 
     "timestamp": 1447840800 
    } 
] 
}""" 
) 

    val timestampTransform = (
    (__ \ "timestamp").json.update(
     __.read[JsNumber].map(
     timestamp => { 
      JsString(new DateTime(timestamp.asOpt[Int].getOrElse(0)).toString("HH:mm")) 
     }) 
    )) 

    val reads = (__ \ 'movies).json.update(
    __.read[JsArray].map(
     movies => { 
     val result = movies.as[List[JsObject]].map(
      element => { 
      element.transform(timestampTransform).get 
      }) 
     Json.toJson(result) 
     } 
    ) 
) 

    println(inputJson.transform(reads)) 

ответ

1

Вот еще один ужасный способ трансформировать.

Для < = игра 2.3.x

import play.api.libs.json._ 
import org.joda.time.DateTime 

case class Movie(id: Int, date: String, parent_id: Int, length: Int, timestamp: String) 
implicit val mWritess = Json.writes[Movie] 
implicit val nreads = new Reads[JsValue] { 
    def reads(json: JsValue): JsResult[JsValue] = json match { 
    case JsObject(Seq(("date", JsString(date)), ("id", pid: JsNumber), ("movies", JsArray(movies)))) => { 
     movies match { 
     case s: scala.collection.mutable.ListBuffer[_] => { 
      val collectedId: Seq[Movie] = s.collect { 
      case JsObject(Seq(("id", mid: JsNumber), ("length", length: JsNumber), ("timestamp", timestamp: JsNumber))) => { 
       Movie(mid.asOpt[Int].getOrElse(0), date, pid.asOpt[Int].getOrElse(0), length.asOpt[Int].getOrElse(0), 
       new DateTime(timestamp.asOpt[Int].getOrElse(0)).toString("HH:mm")) 
      } 
      } 
      JsSuccess(Json.toJson(collectedId)) 
     } 
     case _ => JsError(s"Error '$date', $pid, $movies") 
     } 
    } 
    case _ => JsError("Invalid format") 
    } 
} 

println(inputJson.transform(nreads)) 

Для воспроизведения 2.4.x

case class Movie(id: Int, date: String, parent_id: Int, length: Int, timestamp: String) 
implicit val mWritess = Json.writes[Movie] 
implicit val nreads = new Reads[JsValue] { 
    def reads(json: JsValue): JsResult[JsValue] = json match { 
    case values: JsObject => { 
     values.fields match { 
     case Seq(("date", JsString(date)), ("id", pid: JsNumber), ("movies", JsArray(movies))) => 
      movies match { 
      case s: scala.collection.mutable.ListBuffer[_] => { 
       val collectedId: Seq[Movie] = s.collect { 
       case movies: JsObject => { 
        movies.fields match { 
        case Seq(("id", mid: JsNumber), ("length", length: JsNumber), ("timestamp", timestamp: JsNumber)) => 
         Movie(mid.asOpt[Int].getOrElse(0), date, pid.asOpt[Int].getOrElse(0), length.asOpt[Int].getOrElse(0), 
         new DateTime(timestamp.asOpt[Int].getOrElse(0)).toString("HH:mm")) 
        } 
       } 
       } 
       JsSuccess(Json.toJson(collectedId)) 
      } 
      case _ => JsError(s"Error '$date', $pid, $movies") 
      } 
     } 
    } 
    case _ => JsError("Invalid format") 
    } 
} 

println(inputJson.transform(nreads)) 
Смежные вопросы