2016-07-26 44 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