2013-03-24 7 views
17

के साथ JSON तत्वों को हटा रहा है मेरे पास एक विशेष JSON नोड है जो आयात org.codehaus.jackson.JsonNode आयात करता है, और आयात 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" 
    } 
] 

मैं ऊपर सरणी के सभी JSON नोड से "familyName" और "middleName" निकालना चाहते हैं। क्या इसे प्राप्त करने का कोई तरीका है?

उत्तर

21

मैं इस परीक्षण किया है नहीं है, लेकिन मुझे लगता है कि कुछ इस तरह आप क्या चाहते हैं करना होगा:

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 के कच्चे पार्स एपीआई और अधिक कुशलता से उपयोग कर सकते हैं, लेकिन कोड एक होगा बहुत गड़बड़

-3

आप केवल एक नया JSONObject बना सकते हैं, "familyName" और "middleName" को छोड़कर सभी नोड्स को पढ़ सकते हैं, फिर उन्हें सभी को एक नई फ़ाइल में सहेजें। यहां एक उदाहरण है। JSON.Simple Example – Read And Write JSON

0

gsteff द्वारा लिखे गए उत्तर का भी उपयोग किया जा सकता है, लेकिन मैंने सोचा कि ऑब्जेक्ट मैपर का उपयोग जेसननोड के बजाय 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); 
     } 
+0

मुझे नहीं लगता कि यह कितना आसान है – eis

3

According to the JSONObject documentation, JSONObject Map.remove है, जो कि कुंजी पर संग्रहीत मान देता है लागू करता है। जैसे

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

मैं हाल ही में इस सवाल के लिए आया था, क्योंकि मैं JSON का एक असामान्य टुकड़ा है कि मैं का एक तत्व को दूर करने के लिए आवश्यक था यह का उपयोग करें:

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

पहले तीन तत्वों एक व्यक्ति और एक संबंधित प्रतिनिधित्व करते हैं स्कोर ऑब्जेक्ट। आखिरी एक "चेतावनियां", स्कोर ऑब्जेक्ट से मेल नहीं खाती थी और यही वह है जिसे मैं निकालना चाहता था।

ऊपर gsteff के जवाब से शुरू JsonNode रूप rootNode ले रहा है, जिस तरह से मैं दूर करने के लिए इस नोड्स के प्रत्येक के माध्यम से पुनरावृति करने के लिए था पाया, एक 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; 
0

जैक्सन के ObjectMapper केवल कुछ ही कदम के साथ समाधान देता है: मैं जब तक यह "चेतावनी" तत्व था चाहता था।

फ़ाइल में जेसन डेटा को 'data.json' सहेजें। आयात कथन के बिना किसी फ़ंक्शन में कोड का पालन करें और फ़ंक्शन का आह्वान करें। परिणामी 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);