J'ai un nœud JSON particulier correspondant à l'importation org.codehaus.jackson.JsonNode et non Import org.codehaus.jackson.map.JsonNode.
[
{
"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"
}
]
Je souhaite supprimer les noms "familyName" et "middleName" de tous les noeuds JSON du tableau ci-dessus. Y'a-t-il une quelconque façon de réussir cela?
Je n'ai pas testé cela, mais je pense que quelque chose comme ça ferait ce que vous voulez:
import org.codehaus.jackson.node.ObjectNode;
// ...
for (JsonNode personNode : rootNode) {
if (personNode instanceof ObjectNode) {
ObjectNode object = (ObjectNode) personNode;
object.remove("familyName");
object.remove("middleName");
}
}
Vous pouvez également le faire plus efficacement en utilisant l’API d’analyse brute de Jackon, mais le code serait beaucoup plus compliqué.
Selon la documentation JSONObject , JSONObject implémente Map.remove, qui renvoie la valeur stockée sur cette clé. Utilisez-le comme
JSONObject json = new JSONObject();
json.put("key", "value");
String str = (String)json.remove("key");
ObjectMapper de Jackson donne une solution en seulement quelques étapes.
Enregistrez les données JSON dans un fichier intitulé "data.json" . Copiez le code suivant dans une fonction sans instruction d'importation et appelez la fonction . Le JSON résultant sera écrit dans un nouveau fichier "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);
La réponse écrite par gsteff peut aussi être utilisée, mais j’ai pensé qu’un moyen plus simple consistait à utiliser le mappeur d’objets pour convertir en JSONArray au lieu de JsonNode et ainsi de suite.
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);
}
Je suis récemment venu à cette question parce que j'avais un morceau inhabituel de JSON dont j'avais besoin pour enlever un élément de:
{
"allan": { "score": 88 },
"bill": { "score": 75 },
"cassie": { "score": 96 },
"warnings": [ { "name": "class_low_numbers", "message": "this class is has less than 10 students" }]
}
Les trois premiers éléments représentent une personne et un objet de score respectif. Le dernier "warnings", ne correspond pas à l'objet partition et c'est celui que je voulais supprimer.
En prenant le rootNode comme le JsonNode de départ à partir de la réponse de gsteff ci-dessus, je l’ai trouvé pour itérer à travers chacun des noeuds, en ajoutant une version mappée de l’objet du noeud à un HashMap qui était l’objet de retour souhaité que je voulais sauf si c'était l'élément "warnings":
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;