Довольно JSON мульти рег в одну строку JSON мульти рег - PullRequest
0 голосов
/ 07 мая 2018

У меня есть строка со многими записями в формате JSON. Я должен преобразовать каждую запись JSON в однострочную запись JSON.

Пример: Входной сигнал:

{
  "field1" : "aa11",
  "field2" : "aa22",
  "structField" : {
    "sf1" : "aaa11",
    "sf2" : "aaa22"
  }
}, {
  "field1" : "bb11",
  "field2" : "bb22",
  "structField" : {
    "sf1" : "bbb11",
    "sf2" : "bbb22"
  }
}, {
  "field1" : "cc11",
  "field2" : "cc22",
  "structField" : {
    "sf1" : "ccc11",
    "sf2" : "ccc22"
  }
}

Выход:

{"field1":"aa11","field2":"aa22", "structField":{"sf1" : "aaa11","sf2" : "aaa22"}},
{"field1":"bb11","field2":"bb22","structField":{"sf1" : "bbb11","sf2" : "bbb22"}}, 
{"field1" : "cc11","field2" : "cc22","structField" : {"sf1" : "ccc11","sf2" : "ccc22"}}

Я использую Scala, чтобы попытаться проанализировать строку и разделить ее на "}, {" и переформатировать мой json:

myMultiJSONString.
  substring(2,myMultiJSONString.length-2).
  split("\\}, \\{").
  map(reg => "{" + reg.trim.replaceAll("\\n","") + "}")

Я думаю, что это грязный путь.

¿Есть ли библиотека, которая может помочь с этим?

Например, десериализация JSON String для «чего-то» и последующая сериализация в однострочной JSON String.

Есть идеи?

Спасибо!

Ответы [ 2 ]

0 голосов
/ 07 мая 2018

Всегда лучше использовать правильный json api, если это подходит для вашего случая использования. Существует множество json apis - Какую библиотеку JSON использовать в Scala?

Я бы сказал, что вы можете использовать circe , который является функциональным scala json api. У них довольно хорошая документация - https://circe.github.io/circe/parsing.html

Пример,

import io.circe._, io.circe.parser._

object CirceAgainSerialisers {

  def main(args: Array[String]): Unit = {

    val rawFakeJson: String =
      """
        |  {
        |    "field1": "aa11",
        |    "field2": "aa22",
        |    "structField": {
        |      "sf1": "aaa11",
        |      "sf2": "aaa22"
        |    }
        |  },
        |  {
        |    "field1": "bb11",
        |    "field2": "bb22",
        |    "structField": {
        |      "sf1": "bbb11",
        |      "sf2": "bbb22"
        |    }
        |  },
        |  {
        |    "field1": "cc11",
        |    "field2": "cc22",
        |    "structField": {
        |      "sf1": "ccc11",
        |      "sf2": "ccc22"
        |    }
        |  }
      """.stripMargin

    val deserialised: Either[ParsingFailure, Json] = parse(s"[$rawFakeJson]")

    val fakeSerialise = deserialised.map(json => json.asArray.getOrElse(Vector.empty).mkString(","))

    fakeSerialise match {
      case Right(json) => println(json)
      case Left(failed) => println(failed)
    }
  }
}

ваш build.sbt будет выглядеть,

name := "serialisers-deserialisers"

version := "0.1"

scalaVersion := "2.12.2"

val circeVersion = "0.9.3"

libraryDependencies ++= Seq(
  "io.circe" %% "circe-core",
  "io.circe" %% "circe-generic",
  "io.circe" %% "circe-parser"
).map(_ % circeVersion)
0 голосов
/ 07 мая 2018

Если входной JSON не слишком велик, один из возможных подходов к достижению этого без использования «грязных» методов - это использовать библиотеку синтаксического анализа JSON для анализа входных данных и вывода их построчно с отключенной функцией «симпатичной печати». .

Структура входных данных не имеет значения, это можно сделать практически напрямую.

Например, используя Json4s :

// since the input is not wrapped as JSON array, we need to wrap it to parse properly
val wrappedAsJsonArray = new StringBuilder("[").append(json).append("]").toString()

val parsed = parse(wrappedAsJsonArray)

implicit val formats = DefaultFormats

parsed.children.foreach(obj => {
  val oneLineJson = write(obj) + ","
  println(oneLineJson) // or write to output file
})

// the output:
{"field1":"aa11","field2":"aa22","structField":{"sf1":"aaa11","sf2":"aaa22"}},
{"field1":"bb11","field2":"bb22","structField":{"sf1":"bbb11","sf2":"bbb22"}},
{"field1":"cc11","field2":"cc22","structField":{"sf1":"ccc11","sf2":"ccc22"}},
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...