2016-06-16 12 views
0

私はオブジェクトのリストを持つJSONを持っています。リスト内のどのアイテムもキーの値としてnullまたは同じオブジェクトを持つことができます。私は最終結果に到達するためにjsonを解析するより速い方法を探しています。JSONオブジェクトを再帰的に解析する - Java

[ 
    { 
     "firstName": "Bruce", 
     "familyMembers": null 
    }, 
    { 
     "firstName": "Gates Family", 
     "familyMembers": [ 
      { 
       "firstName": "Bill", 
       "familyMembers": null 
      }, 
      { 
       "firstName": "Steve", 
       "familyMembers": null 
      } 
     ] 
    }, 
    { 
     "firstName": "Lee", 
     "familyMembers": null 
    }, 
    { 
     "firstName": "Chan", 
     "familyMembers": null 
    } 
] 

出力がセット=( "ブルース"、 "ビル"、 "スティーブ"、 "リー"、 "チャン")でなければなりません - データ構造は次のようになります。

私は、Javaでこれを行うための最良の方法を探しています。このような構文解析の地獄に巻き込まれて、応答時間が増えないようにしています。 これに感謝します。

あなたが

はJSONパターンと類似のフィールドを持つJavaクラスを定義して、同じようにそれらを結合し、ジャクソン・データバインド-2.6.5.jarに定義されてObjectMapper使用することができます

+0

http://stackoverflow.com/questions/2591098/how-to-parse-json-in-java –

+0

ジャクソンのストリームパーサを使うの複製。 – jtahlborn

+0

サイドノートに。コンテンツは{}句で始まるため、そこにあるファイルはJSON標準に準拠していません。例えば。{メンバー:[{1:2}、{3:4}]} –

答えて

0

:今、あなたは意志

import com.fasterxml.jackson.databind.DeserializationFeature; 
import com.fasterxml.jackson.databind.ObjectMapper; 

ObjectMapper objectMapper = new ObjectMapper(); 
objectMapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false); 
objectMapper.setSerializationInclusion(JsonInclude.Include.NON_EMPTY); 
Family family=objectMapper.readValue(jsonString, Family.class); 

あなたのJSON文字列パターンに似たjavaオブジェクトを持っていて、好きなように印刷することができます。

0

再帰的な実装を試してください。

public static void jsonArrayToSet(JSONArray jAry, Set<String> result, String targetKey, String subArrayKey, boolean includeNode){ 
    try { 
     for (int i = 0; i < jAry.length(); i++) { 
      JSONObject jObj = jAry.getJSONObject(i); 
      boolean hasSubArray = false; 
      JSONArray subArray = null; 
      if(jObj.has(subArrayKey)){ 
       Object possibleSubArray = jObj.get(subArrayKey); 
       if(possibleSubArray instanceof JSONArray){ 
        hasSubArray = true; 
        subArray = (JSONArray) possibleSubArray; 
       } 
      } 
      if(hasSubArray){ 
       if(includeNode){ 
        result.add(jObj.getString(targetKey)); 
       } 
       jsonArrayToSet(subArray, result, targetKey, subArrayKey, includeNode); 
      } else { 
       result.add(jObj.getString(targetKey)); 
      } 
     } 
    } catch (JSONException e){ 
     e.printStackTrace(); 
    } 
} 

jAry:ソースJSONArray

resultSetあなたが書きたい

targetKey:あなたはresultに追加するエントリにマップキーを。

subArrayKeyJSONArrayに対応するキー。

includeNode:現在のJSONOnjectがサブアレイを含むノードの場合は、resultに追加してください。あなたのケースでは

、あなたが呼び出すことができます。

jsonArrayToSet(yourJsonArray, yourSet, "firstName", "familyMembers", false); 
1

私のコメントで述べたように。

最初の問題は、JSONファイルの内容です。標準に基づいて、{}のセットでラップする必要があります。

{ 
    "members": [ 
     { 
      "firstName": "Bruce", 
      "familyMembers": null 
     }, 
     { 
      "firstName": "Gates Family", 
      "familyMembers": [ 
       { 
        "firstName": "Bill", 
        "familyMembers": null 
       }, 
       { 
        "firstName": "Steve", 
        "familyMembers": null 
       } 
      ] 
     }, 
     { 
      "firstName": "Lee", 
      "familyMembers": null 
     }, 
     { 
      "firstName": "Chan", 
      "familyMembers": null 
     } 
    ] 
} 

はまた、私は「ゲイツファミリー」値が出力の一部であるべきだと思いますか?これは "FirstName"属性の下にあるためです。

とにかく、ここに私の解決策は、org.jsonライブラリに基づいています。また、GoggleのGSonライブラリを使用して、JSONファイルの読み込みに使用しています。おそらく

import org.json.*; 

import java.io.File; 
import java.util.HashMap; 
import java.util.Map; 

import com.google.common.base.Charsets; 
import com.google.common.io.Files; 

public class solution { 

    public static final String JSON_DATA_FILE_PATH = "./data/source_37848106.json"; 

    private static boolean hasMoreFamilyName(JSONObject json) { 
     return json.has("familyMembers") && json.get("familyMembers") != JSONObject.NULL; 
    } 

    private static void trackFirstName(Map<String, Integer> nameTracker, JSONObject json) { 
     if (!nameTracker.containsKey(json.getString("firstName"))) { 
      nameTracker.put(json.getString("firstName"), /*DUMMY VALUE =*/1); 
     } 
    } 

    private static void getNames(Map<String,Integer> nameTracker, JSONArray jsonArr) { 
     for (int i = 0; i< jsonArr.length(); i++) { 
      JSONObject item = jsonArr.getJSONObject(i); 
      if (hasMoreFamilyName(item)) { 
       getNames(nameTracker, item.getJSONArray("familyMembers")); 
      } 
      trackFirstName(nameTracker, item); 
     } 
    } 

    public static void main(String[] args) { 
     Map<String, Integer> nameTracker = new HashMap<>(); 

     try { 
      String text = Files.toString(new File(JSON_DATA_FILE_PATH), Charsets.UTF_8); 
      JSONObject json = new JSONObject(text); 
      getNames(nameTracker, json.getJSONArray("members")); 
     } 
     catch (Exception ex) { 
      System.out.println("Something is wrong."); 
     } 

     for (Map.Entry<String,Integer> entry : nameTracker.entrySet()) { 
     System.out.println(entry.getKey()); 
    } 
} 
関連する問題