2016-07-26 32 views
0

我想讀取嵌套的json文件。獲取嵌套json中的所有列名稱

是否有任何方法來存儲在這個json文件中的所有列名稱。

class ReadData { 
    public static void main(String args[]) throws Exception{ 

     SparkConf conf = new SparkConf().setAppName("Search").setMaster("local[*]"); 
     JavaSparkContext sc= new JavaSparkContext(conf); 
     SQLContext sqlContext = new org.apache.spark.sql.SQLContext(sc); 
     DataFrame df1 = sqlContext.read().json("TestData.json"); 
     df1.printSchema(); 
     String columns[]=df1.columns(); 
     int total_columns=columns.length; 
     System.out.println("column names :"); 
     for(int i=0;i<total_columns;i++){ 
      System.out.println(columns[i]); 
     } 
    } 

TestData.json的內容:

{ 
    "id":"1", 
    "name": { 
     "first_name":"Joe", 
     "last_name":"Thomas" 
    } 
} 

我的代碼的輸出:

column names : 

id 
name 

預期成果是:

column names : 
id 
name.first_name 
name.last_name 
+0

將是美好的,如果你能提供什麼是在'json'文件的詳細信息,並制定更對你的預期產出。沒有適當的投入,社區幾乎不可能預測投入和產出。 –

+0

謝謝Samuel的迴應。 json文件的內容:{「id」:「1」,「name」:{「first_name」:「Joe」,「last_name」:「Thomas」}}我想要所有列名稱的json像id,name .first_name和name.last_name – PShah

+0

另外,你到目前爲止嘗試過什麼,以及什麼阻止了你得到你需要的東西?如果您可以發佈您的代碼並與我們分享,我們將爲您解決它將感激 –

回答

0

這裏是一個可能的解決方案你的問題。我試圖處理一些場景,但這應該會有所斬獲。

package com.controller; 

import java.io.IOException; 
import java.nio.charset.Charset; 
import java.nio.charset.StandardCharsets; 
import java.nio.file.Files; 
import java.nio.file.Paths; 
import java.util.ArrayList; 
import java.util.Iterator; 
import java.util.List; 

import org.json.JSONArray; 
import org.json.JSONObject; 

public class JSONColumnNameExtract { 

static List<String> colNames; 

public static void main(String[] args) { 
    colNames = new ArrayList<String>(); 
    String jsonString = ""; 
    try { 
     jsonString = readFile("C:\\jsonInput.json", 
       StandardCharsets.UTF_8); 
    } catch (IOException e) { 
     e.printStackTrace(); 
    } 
    JSONObject mainJObject = new JSONObject(jsonString); 
    Iterator<?> keys = mainJObject.keys(); 
    while (keys.hasNext()) { 
     String key = (String) keys.next(); 
     if (mainJObject.get(key) instanceof JSONArray) { 
      JSONArray array = (JSONArray) mainJObject.get(key); 
      for (int i = 0; i < array.length(); i++) { 
       iterateJSON(array.get(i), key); 
      } 
      continue; 
     } 
     if (mainJObject.get(key) instanceof JSONObject) { 
      iterateJSON(mainJObject.get(key), key); 
     } else { 
      if (!colNames.contains(key)) 
       colNames.add(key); 
     } 
    } 
    for (String colName : colNames) 
     System.out.println(colName); 
} 

private static void iterateJSON(Object object, String key2) { 
    JSONObject jsonObject = ((JSONObject) object); 
    Iterator<?> keys = jsonObject.keys(); 
    String key; 
    while (keys.hasNext()) { 
     key = (String) keys.next(); 
     if (jsonObject.get(key) instanceof JSONArray) { 
      JSONArray array = (JSONArray) jsonObject.get(key); 
      for (int i = 0; i < array.length(); i++) { 
       iterateJSON(array.get(i), key); 
      } 
      continue; 
     } 
     if (jsonObject.get(key) instanceof JSONObject) { 
      iterateJSON(jsonObject.get(key), key2 + "." + key); 
     } else { 
      if (!colNames.contains(key2 + "." + key)) 
       colNames.add(key2 + "." + key); 
      continue; 
     } 
    } 
} 

static String readFile(String path, Charset encoding) throws IOException { 
    byte[] encoded = Files.readAllBytes(Paths.get(path)); 
    return new String(encoded, encoding); 
} 

} 

採樣輸入的Json我已經採取了:

{ 
    "id":"1", 
    "name":{ 
     "first_name":"Joe", 
     "last_name":"Thomas" 
    }, 
    "address":[ 
     { 
     "first_line":"Joe", 
     "city":{ 
      "city_name":"Bangalore", 
      "city_pin":650659 
     } 
     }, 
     { 
     "first_line":"Joe", 
     "city":{ 
      "city_name":"Bangalore", 
      "city_pin":650659, 
      "city_pin2":65065933 
     } 
     } 
    ] 
} 

輸出:

address.first_line 
address.city.city_name 
address.city.city_pin 
address.city.city_pin2 
name.last_name 
name.first_name 
id