2016-04-27 8 views
0

私は私のApache FLINKプログラムを持っている:ScalaのJSONライブラリが正しく

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))) 
    } 
私は通常のScalaの地図への入力JSONファイルを解析したい

およびそのため私は、デフォルトscala.util.parsing.json._ライブラリを使用しています。

最初のprintlnステートメントの出力は、JSON構文解析機能で必要とされるclass java.lang.Stringです。

第2のprintln関数の出力は、実際にJSON文字列の末尾に追加されます("\"\"\"")。これはJSONパーサにも必要です。

この時点で、コンソールに表示された2番目のprintlnコマンドの出力をコピーしてJSON.parseFull()関数に渡すと、正しく解析されます。

したがって、第3のprintln関数は、渡された同じ文字列を適切に解析する必要がありますが、失敗したことを意味する "None"文字列を出力しません。

なぜこれが起こり、どのように機能させることができますか?第二のprintln関数の

答えて

2

出力もJSONパーサーによって必要とされる「\」\「\」」で追加され、先頭に付加実際のJSON文字列である。

いいえ、もちろんそれはにISN 't。"""{}"""のような文字列が生成されますが、これは有効なJSONではなく、パーサーによって正しく拒否されます。"""{}"""をScalaコードで書くと、引用符は文字列自体には含まれません。文字列の内容は有効なJSONである{}です。

+0

その中にあれば、ライブラリにのみJSONを解析し、 this、 '" "" {"name": "punit"} "" "'、フォーム。私の質問の記述で述べたように、prined出力をコピーしてそれをパーサに送ると、それは動作します。しかし、コードではうまくいかず、理由を理解できません。あなたは自分で見るためにこのライブラリを試すことができます。 –

+1

それは私が最後の文で説明するものです。 "{" name ":" punit "}" "" '' {\ "name \":\ "punit \"} "'と同じです: punit "}'は、有効なJSONであり、三重引用符は含みません。三重引用符を含む別の文字列を作成しています。 –

+1

これは 'println(" "{" name ":" punit "}" "") '、' println( "{\" name \ ":\" punit \ "}") 'の出力で見ることができます。あなたの/ * 2 * /。または、 '((j.first(1).collect())(0))==" "{{" name ":" punit "}" "' 'をチェックする。 –

0

あなたは以下のコードが動作するよう要求されていないだけで

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

しかし、上記のコードに

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

を変更する必要があります。

val data=env.readTextFile("file:///path/to/json").flatMap(line => JSON.parseFull(line)) 
関連する問題