43

org.codehaus.jackson.map.JsonNodeのインポートではなく、org.codehaus.jackson.JsonNodeのインポートに対応する特定のJSONノードがあります。

[
    {
        "givenName": "Jim",
        "formattedName": "jimJackson",
        "familyName": null,
        "middleName": "none",
        "honorificPrefix": "mr",
        "honorificSuffix": "none"
    },
    {
        "givenName": "john",
        "formattedName": "johnLasher",
        "familyName": null,
        "middleName": "none",
        "honorificPrefix": "mr",
        "honorificSuffix": "none"
    },
    {
        "givenName": "carlos",
        "formattedName": "carlosAddner",
        "familyName": null,
        "middleName": "none",
        "honorifiPrefix": "mr",
        "honorificSuffix": "none"
    },
    {
        "givenName": "lisa",
        "formattedName": "lisaRay",
        "familyName": null,
        "middleName": "none",
        "honorificPrefix": "mrs",
        "honorificSuffix": "none"
    },
    {
        "givenName": "bradshaw",
        "formattedName": "bradshawLion",
        "familyName": null,
        "middleName": "none",
        "honorificPrefix": "mr",
        "honorificSuffix": "none"
    },
    {
        "givenName": "phill",
        "formattedName": "phillKane",
        "familyName": null,
        "middleName": "none",
        "honorificPrefix": "mr",
        "honorificSuffix": "none"
    },
    {
        "givenName": "Gabriel",
        "formattedName": "gabrielMoosa",
        "familyName": null,
        "middleName": "none",
        "honorificPrefix": "mr",
        "honorificSuffix": "none"
    }
]

上記の配列のすべてのJSONノードから「familyName」と「middleName」を削除したいと思います。これを達成する方法はありますか?

4

7 に答える 7

49

私はこれをテストしていませんが、このようなものがあなたが望むことをするだろうと思います:

import org.codehaus.jackson.node.ObjectNode;
// ...
for (JsonNode personNode : rootNode) {
    if (personNode instanceof ObjectNode) {
        ObjectNode object = (ObjectNode) personNode;
        object.remove("familyName");
        object.remove("middleName");
    }
}

Jackonの生の解析APIを使用してこれをより効率的に行うこともできますが、コードは非常に面倒になります。

于 2013-03-24T21:36:08.810 に答える
5

JacksonのObjectMapperは、わずか数ステップでソリューションを提供します。

jsonデータを「data.json」というファイルに保存します。次のコードをimportステートメントなしで関数にコピーし、関数を呼び出します。結果のJSONは、新しいファイル「data1.json」に書き込まれます。

import java.io.File;
import java.io.IOException;

import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.JsonNode;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.node.ObjectNode;
ObjectMapper objectMapper = new ObjectMapper();
        JsonNode jsonNode = objectMapper.readTree(new File("data.json"));
        for (JsonNode node : jsonNode) {
            ((ObjectNode)node).remove("familyName");
            ((ObjectNode)node).remove("middleName");
        }
        objectMapper.writeValue(new File("data1.json"), jsonNode);
于 2018-03-01T07:11:56.823 に答える
2

最近、次の要素を削除する必要のあるJSONの異常な部分があったため、この質問に行き着きました。

{
   "allan": { "score": 88 },
   "bill": { "score": 75 },
   "cassie": { "score": 96 },
   "warnings": [ { "name": "class_low_numbers", "message": "this class is has less than 10 students" }]
}

最初の3つの要素は、人とそれぞれのスコアオブジェクトを表します。最後の「警告」はスコアオブジェクトと一致しませんでした。それは私が削除したかったものです。

上記のgsteffの回答からrootNodeを開始JsonNodeとして、これを削除する方法は、各ノードを反復処理し、ノードのオブジェクトマップバージョンをHashMapに追加することでした。 「警告」要素でした:

HashMap<String, ScoreDetails> results = new HashMap<String, ScoreDetails>();

ObjectMapper mapper = new ObjectMapper();
mapper.configure(MapperFeature.ACCEPT_CASE_INSENSITIVE_PROPERTIES, true);
mapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);

Iterator<Map.Entry<String, JsonNode>> fields = rootNode.fields();
while (fields.hasNext()) {
  Map.Entry<String, JsonNode> next = fields.next();
  if (!next.getKey().equals("warnings")) {
    results.put(
        next.getKey(), mapper.treeToValue(next.getValue(), ScoreDetails.class));
  }
}

return results;
于 2018-02-08T06:59:36.920 に答える
1

gsteffによって書かれた答えも使用できますが、より簡単な方法は、オブジェクトマッパーを使用してJsonNodeではなくJSONArrayに変換し、そこから移動することだと思いました。

ObjectMapper mapper = new ObjectMapper();
String stringJsonArray = mapper.writeValueAsString(list);
JSONArray csvDatabindedtoBean = new JSONArray(stringJsonArray);
        JSONArray finalArray = new JSONArray();
for (int val = 0; val < csvDatabindedtoBean.length(); val++) {
            JSONObject finalObject = csvDatabindedtoBean.getJSONObject(val);
                finalObject.remove("familyName");
                finalObject.remove("middleName");

            }
            finalArray.put(finalObject);
        }
于 2013-03-24T23:35:50.587 に答える
1

JSONObjectのドキュメントによると、JSONObjectはMap.removeを実装し、そのキーに格納されている値を返します。次のように使用します

JSONObject json = new JSONObject();
json.put("key", "value");
String str = (String)json.remove("key");
于 2016-10-07T05:51:21.737 に答える
0

私が必要としていたのは、特定のプレフィックスを持つキーを持つフラットルートオブジェクトから要素を削除することでした。私の解決策はこれでした:

Iterator<String> it = jsonNode.fieldNames();
        while (it.hasNext()) {
            String nextKey = it.next();
            if (nextKey.startsWith("prefix")) {
                it.remove();
                ((ObjectNode)jsonNode).remove(nextKey);
            }
        }

イテレータからも要素を削除する必要があることに注意してください。そうしないと、ConcurrentAccessタイプの例外が発生します。

于 2021-04-06T08:50:30.013 に答える
-4

新しいJSONObjectを作成し、「familyName」と「middleName」を除くすべてのノードを読み取ってから、それらすべてを新しいファイルに保存するだけです。これが例です。JSON.Simpleの例–JSONの読み取りと書き込み

于 2013-03-24T20:29:13.890 に答える