2017-06-28 6 views
0

JSONコンテンツをString内に持っていて、時には削除しなければならない数値タグがあります。以下 Javaを使用してダイナミックjsonの数値タグを削除します

は、上記の場合、サンプルJSONコンテンツ

{ 
"Test": { 
    "P1": false, 
    P2": { 
     "2000": [ 
     { 
     "DP": "DP TEST", 
     "id": "ID TEST" 
     } 
       ], 
     "4000": [ 
     { 
     "DP": "DP TEST", 
     "id": "ID TEST" 
     } 
     ], 
     "5000": [ 
     { 
     "DP": "DP TEST", 
     "id": "ID TEST" 
     } 
     ], 
     "8000": [ 
     { 
     "DP": "DP TEST", 
     "id": "ID TEST" 
     } 
     ], 
     "6000": [ 
     { 
     "DP": "DP TEST", 
     "id": "ID TEST" 
     } 
     ] 
    }, 
    "P3": "XYZ", 
    "P4": ABC, 
    "VL": "", 
    "PL": [{ 
      "start_date": 1496480880.0, 
      "id": "TEST1" 
     } 
    ], 
}, 
"PS": "AMD", 
"links": [{ 
     "LOC": "en-US", 
     "PS": "AMD" 
    }, { 
     "LOC": "fr-CA", 
     "PS": "AMD" 
    } 
] 
} 

ある「P2」タグは、数字キーを有しており、このようなケースでは、JSONに文字列を変換した後のように、それを表示する必要があります。つまり、数字キーを持つタグを削除する必要があります。

私はorg.json、org.json.simple、およびcom.gsonも試してみましたが、何も動作していないようです。

私は以下のコードを使用して、各ラインを読むことができていますが

public static void printJson(JsonElement jsonElement) { 

    // Check whether jsonElement is JsonObject or not 
    if (jsonElement.isJsonObject()) { 
     Set<Entry<String, JsonElement>> ens = ((JsonObject) jsonElement).entrySet(); 
     if (ens != null) { 
      // Iterate JSON Elements with Key values 
      for (Entry<String, JsonElement> en : ens) { 
       try{ 
        Integer.parseInt(en.getKey()); 
        break; 
       }catch(NumberFormatException ex){ 
        if("".equals(str)){ 
         str = "\"" + en.getKey() + "\": {"; 
        }else{ 
         str = str + "\"" + en.getKey() + "\": {"; 
        } 
        System.out.println(en.getKey() + "-----" + en.getValue()); 
       } 
       printJson(en.getValue()); 
      } 
     } 
    } 

    // Check whether jsonElement is Arrary or not 
    else if (jsonElement.isJsonArray()) { 
       JsonArray jarr = jsonElement.getAsJsonArray(); 
       // Iterate JSON Array to JSON Elements 
       for (JsonElement je : jarr) { 
        printJson(je); 
       } 
    } 

    // Check whether jsonElement is NULL or not 
    else if (jsonElement.isJsonNull()) { 
     // print null 
     System.out.println("null"); 
    } 
    // Check whether jsonElement is Primitive or not 
    else if (jsonElement.isJsonPrimitive()) { 
     // print value as String 
     if("".equals(str)){ 
      str = "\"" + jsonElement.getAsString() + "\""; 
     }else{ 
      str = str + "\"" + jsonElement.getAsString() + "\""; 
     } 
     System.out.println(jsonElement.getAsString()); 
    } 
    } 

をsnipetしかし、数字キー付きタグを削除することができません。誰かがこれで私を助けてくださいできますか?

+0

の下に与えられ、その後、 'P2'は空になります。あなたの期待する結果が何であるかを示してください。 ---また、 'str'とは何ですか? – Andreas

+0

ええ、私はp2のために空のタグを表示する必要があります。このとstrはグローバル文字列変数です。 – Lettisha

答えて

1

あなたが数値でJSONObjectキーを削除したい場合、あなたはこのようにそれを行うことができます。

private static void strip(JSONObject obj) { 
    for (Iterator<String> keyIter = obj.keys(); keyIter.hasNext();) { 
     String key = keyIter.next(); 
     if (key.matches("\\d+")) 
      keyIter.remove(); 
     else 
      strip(obj.get(key)); 
    } 
} 
private static void strip(Object value) { 
    if (value instanceof JSONObject) { 
     strip((JSONObject) value); 
    } else if (value instanceof JSONArray) { 
     for (Object elem : (JSONArray) value) 
      strip(elem); 
    } 
} 

テスト

String input = new String(Files.readAllBytes(Paths.get("path/to/file.json")), StandardCharsets.US_ASCII); 
JSONObject obj = new JSONObject(input); 
strip(obj); 
System.out.println(obj.toString(2)); 

出力

{ 
    "PS": "AMD", 
    "Test": { 
    "P1": false, 
    "P2": {}, 
    "P3": "XYZ", 
    "P4": "ABC", 
    "VL": "", 
    "PL": [{ 
     "id": "TEST1", 
     "start_date": 1.49648088E9 
    }] 
    }, 
    "links": [ 
    { 
     "LOC": "en-US", 
     "PS": "AMD" 
    }, 
    { 
     "LOC": "fr-CA", 
     "PS": "AMD" 
    } 
    ] 
} 
+0

こんにちは、ありがとう!私は今、子要素を読み、数値をチェックし、それらを削除することができます。あなたの答えは本当に役に立ち、非常に正確です。しかし、まだ1つの問題があります。 2〜3レベルの要素までチェックしています。しかし、4番目または次のレベルの数値キー要素がある場合、その要素キーをチェックしません。単にそれをそのまま表示します。それらを削除しません。すべてのレベルでそれらを削除する可能性はありますか? – Lettisha

+0

@Lettishaコードは無限に深いレベルまでチェックします。 – Andreas

+0

ちょっと最後の質問 - 整数キーの名前をいくつかの文字列キーに変更する可能性はありますか?私は、整数キーを持つタグからデータを読み取ることができないことを知っています。しかし、整数キーのデータを読み込んで、そのようなキーを有効なキーに名前を変更できるのであれば、ちょっと待ってください。 – Lettisha

0

Iソルートを得たイオンとアンドレアスの助け。

しかし、私はそれに取り組んでいる間に別の問題がありました。それは2-3レベルのためだけにうまくいきました。 3番目のレベルの後に、数字キーがある場合、それらは削除されていませんでした。

オブジェクトがorg.json.JSONObjectのインスタンスであるかどうかをチェックし、そのJSONObjectにJSONArrayがあるかどうかを確認する条件をもう1つ追加しました。あなたは* *「数字キーを持っているタグを削除」した場合

サンプルコードが

if (value instanceof org.json.JSONArray) { 
     for (int i=0; i< ((org.json.JSONArray) value).length(); i++) { 
      try{ 
       if(((org.json.JSONArray) value).get(i).getClass().getName() =="org.json.JSONObject"){ 
        strip((JSONObject) ((org.json.JSONArray) value).get(i)); 
       } 

      }catch(Exception ex){ 
      } 
     } 
    } 
関連する問題