Arbeit habe ich mein Apache Flink Programm:Scala JSON Bibliothek nicht richtig
import org.apache.flink.api.scala._
import scala.util.parsing.json._
object numHits extends App {
val env = ExecutionEnvironment.getExecutionEnvironment
val data=env.readTextFile("file:///path/to/json/file")
val j=data.map { x => ("\"\"\""+x+"\"\"\"") }
/*1*/ println(((j.first(1).collect())(0)).getClass())
/*2*/ println(((j.first(1).collect())(0)))
/*3*/ println(JSON.parseFull((j.first(1).collect())(0)))
}
ich den Eingang JSON-Datei in normale scala Karte analysieren will und dass ich die Standard-scala.util.parsing.json._
Bibliothek verwenden.
Die Ausgabe der ersten println
-Anweisung ist class java.lang.String
, die von der JSON-Parsing-Funktion benötigt wird.
Die Ausgabe der zweiten println
-Funktion ist die tatsächliche JSON-Zeichenfolge, die von "\"\"\""
angefügt und vorangestellt wird, was auch vom JSON-Parser benötigt wird.
Jetzt an diesem Punkt, wenn ich die Ausgabe des zweiten println
Befehl in der Konsole gedruckt kopieren und an die JSON.parseFull()
Funktion übergeben, wird es richtig analysiert.
Daher sollte die dritte println
-Funktion die gleiche Zeichenfolge korrekt analysieren, die an sie übergeben wird, aber es gibt keine "None" -Zeichenfolge aus, was bedeutet, dass sie fehlgeschlagen ist.
Warum passiert das und wie kann ich es funktionieren lassen?
Die Bibliothek nur die json parst, wenn seine in dies, '" "" {"name": "punit"} "" ", form. Und wie ich in meiner Fragebeschreibung erwähnte, wenn ich die printed Ausgabe kopiere und es dem Parser füttere, funktioniert es. Aber im Code wird es nicht funktionieren und ich kann nicht herausfinden warum. Sie können diese Bibliothek ausprobieren, um selbst zu sehen. –
Das erkläre ich im letzten Satz. ' "" "{" Name ":" punit "}" ""' ist die gleiche wie ' "{\" Name \ ": \" punit \ "}"': die Zeichenfolge '{ "name" steht:“ punit "}", das gültige JSON ist und keine dreifachen Anführungszeichen enthält. Sie erstellen eine andere Zeichenfolge, die dreifache Anführungszeichen enthält. –
Sie können dies sehen durch Ausgabe von 'println ("" "{" name ":" punit "}" "")', 'println ("{\" Name \ ": \" punit \ "}")', und deine/* 2 * /. Oder überprüfen Sie '((j.first (1) .collect()) (0)) ==" "" {"name": "punit"} "" "'. –