Вы можете отбросить все до {
, если это безопасно, так что вы получите строку json.Я предполагаю, что ваш формат журнала "garbage{json}"
пример,
scala> val log = """SEQ^F!org.apache.hadoop.io.LongWritable^Yorg.apache.hadoop.io.Text^@^@^@^@^@^@ìþNmbÃ<92>w^G6ùó¯Ãl^@^@^X^E^@^@^@^H^@^@^^¯/âë<8e>^Wú{"key1": "value1", "key2": ["1", "2"]}"""
log: String = SEQ^F!org.apache.hadoop.io.LongWritable^Yorg.apache.hadoop.io.Text^@^@^@^@^@^@ìþNmbÃ<92>w^G6ùó¯Ãl^@^@^X^E^@^@^@^H^@^@^^¯/âë<8e>^Wú{"key1": "value1", "key2": ["1", "2"]}
scala> val extractJson = log.dropWhile(char => char != '{')
extractJson: String = {"key1": "value1", "key2": ["1", "2"]}
Затем используйте любой json api, Im, используя circe в следующем примере,
scala> import io.circe.parser._
import io.circe.parser._
scala> parse(extractJson)
res3: Either[io.circe.ParsingFailure,io.circe.Json] =
Right({
"key1" : "value1",
"key2" : [
"1",
"2"
]
})
Если вы хотите извлечь какой-то конкретный элемент json,
scala> res3.map(j => (j \\ "key1").headOption)
res4: scala.util.Either[io.circe.ParsingFailure,Option[io.circe.Json]] = Right(Some("value1"))