2016-04-27 4 views
0

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?

Antwort

2

Ausgang der zweiten println Funktion ist die tatsächliche JSON String angehängt und vorangestellt durch "\" \ "\"“, die auch durch die JSON Parser benötigt wird.

Nein, es natürlich isn Das erzeugt eine Zeichenkette wie """{}""", was kein gültiger JSON ist und vom Parser korrekt zurückgewiesen wird.Wenn Sie """{}""" in Scala-Code schreiben, sind die Anführungszeichen nicht Teil der Zeichenkette selbst, sie begrenzen nur das Literal: die Inhalt der Zeichenfolge ist {}, die gültige JSON ist

+0

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. –

+1

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. –

+1

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"} "" "'. –

0

Sie müssen nur

val j=data.map { x => ("\"\"\""+x+"\"\"\"") } 

zu

val j=data.map { x => x.replaceAll("\"", "\\\"") } 

Aber der obige Code wie der Code unten nicht funktioniert erforderlich ändern:

val data=env.readTextFile("file:///path/to/json").flatMap(line => JSON.parseFull(line))