2013-03-24 29 views
17

Belirli bir JSON Düğümü, org.codehaus.jackson.JsonNode öğesinin içe aktarılmasına karşılık gelir ve içe aktarma org.codehaus.jackson.map.JsonNode.JSON öğelerini jackson ile Kaldırma

[ 
    { 
     "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" 
    } 
] 

Yukarıdaki dizinin tüm JSON düğümlerden "familyName" ve "İkinci ad" kaldırmak istiyorum. Bunu başarabilmenin bir yolu var mı?

cevap

21

Bu test değil ama böyle bir şey istediğini yapacağını düşünüyorum:

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

Ayrıca bu daha verimli kullanarak JACKON en ham ayrıştırma API yapabilirdi ama kod olurdu çok daha dağınık.

0

Gsteff tarafından yazılan cevap da kullanılabilir, ancak JsonNode yerine JSONArray öğesine dönüştürmek ve oradan gitmek için nesne eşleyicisini kullanmak daha kolay bir yol olduğunu düşündüm.

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); 
     } 
+0

Bunun nasıl daha kolay olduğunu göremiyorum – eis

3

According to the JSONObject documentation, JSONObject nesnesi bu anahtar saklandı değerini verir Map.remove, uygular. Ben bir öğesini kaldırmak için gerekli JSON alışılmadık bir parçası vardı çünkü son zamanlarda bu soruya geldi

JSONObject json = new JSONObject(); 
json.put("key", "value"); 
String str = (String)json.remove("key"); 
0

gibi kullanın:

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

ilk üç unsurdan bir kişi ve ilgili temsil puan nesnesi. Son bir "uyarı", skor nesnesine uymadı ve çıkarmak istediğim bu.

Gsteff'un yukarıdaki yanıtından başlayarak JsonNode'un başlangıç ​​JsonNode'u olarak rootNode'u aldığımda, bunu kaldırmayı bulduğum yol düğümlerin her bir nesnesini yinelemek ve düğümün bir nesnenin eşlenmiş sürümünün HashMap'e eklenmesidir.

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; 
0

Jackson ObjectMapper sadece birkaç adım takip çözümünü verir: Ben "uyarılar" eleman oldu sürece istedi.

Json verilerini 'data.json' adlı bir dosyaya kaydedin. İçe aktarma ifadeleri olmadan bir kod içine aşağıdaki kodu kopyalayın ve işlevi çağırın. Ortaya çıkan JSON yeni bir dosyaya yazılacak '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); 
İlgili konular