1. 程式人生 > >scala處理json檔案

scala處理json檔案

讀取json資料處理並儲存

輸入檔案資料為json格式,csid.txt

{"bid": "1","品牌":"奧迪","廠商":"一汽-大眾奧迪","csid":"5"}
{"bid": "1","品牌":"奧迪","廠商":"奧迪(進口)","csid":"63"}
{"bid": "1","品牌":"奧迪","廠商":"奧迪RS","csid":"276"}
{"bid": "56","品牌":"阿斯頓·馬丁","廠商":"阿斯頓·馬丁","csid":"81"}
{"bid": "56","品牌":"阿斯頓·馬丁","廠商":"AMR", "csid":"349"}
{"bid": "78","品牌":"阿爾法·羅密歐","廠商":"阿爾法·羅密歐","csid":"71"}
{"bid": "239","品牌":"艾康尼克","廠商":"艾康尼克ICONIQ Motors","csid":"353"}
{"bid": "224","品牌":"Alpina","廠商":"Alpina","csid":"338"}
{"bid": "2","品牌":"寶馬","廠商":"華晨寶馬","csid":"25"}
{"bid": "2","品牌":"寶馬","廠商":"寶馬(進口)","csid":"59"}

輸出檔案資料為k-v格式,csid.txt

276 品牌_奧迪廠商_奧迪RS
5   品牌_奧迪廠商_一汽-大眾奧迪
59  品牌_寶馬廠商_寶馬(進口)
353 品牌_艾康尼克廠商_艾康尼克ICONIQ Motors
71  品牌_阿爾法·羅密歐廠商_阿爾法·羅密歐
25  品牌_寶馬廠商_華晨寶馬
81  品牌_阿斯頓·馬丁廠商_阿斯頓·馬丁
338 品牌_Alpina廠商_Alpina
63  品牌_奧迪廠商_奧迪(進口)
349 品牌_阿斯頓·馬丁廠商_AMR

操作程式碼:

/**
* 將本地json字典檔案轉化為k-v格式(格式:sid    車級_中型車\u0001品牌_大眾u0001)
* @param inFilePath 輸入檔案路徑
* @param outFilePath 輸出檔案路徑
*/
def proDicFromJson(inFilePath: String, outFilePath: String) {
    val labelFields = List("車級", "品牌", "車系", "年款", "廠商", "經銷商", "車型報價", "最低價(萬元)", "最高價(萬元)", "省份", "地市", "關注點", "類別", "備註")

    //    1.獲取檔名
    val filename = outFilePath.substring(outFilePath.lastIndexOf("/") + 1, outFilePath.indexOf("."))
    //    2.讀取json檔案
    val lines = Source.fromFile(inFilePath).getLines().toIterator
    var dicMap: Map[String, String] = Map()
    while (lines.hasNext) {
        val labeljson = JSON.parseFull(lines.next())
        labeljson match {
            //note1!
            case Some(labelmap: Map[String, Any]) =>
            var value = ""
            labelFields.foreach { x =>
                if (labelmap.contains(x)) {
                var tmpVal = labelmap(x)
                value += x + "_" + labelmap(x) + "\u0001" //多個屬性值使用"\u0001"分割
                }
            }
            val key = labelmap(filename).toString()
            dicMap += key -> value
            case _ => println(labeljson.toString());
        }
    }
   //    3..獲取指定欄位值並儲存
    val writer = new PrintWriter(new File(outFilePath))
    dicMap.foreach { x =>
    writer.write(x._1 + "\t" + x._2 + "\n")
    }
    writer.close()
    println(filename + "轉換成功!")
}

說明:
- 檔名要和json中key值相同。

重點: