2016-04-14 19 views
3

'daki iki farklı json dizisine ayırın json için oldukça yeni ve normalde çok fazla kodlama kullanmayın. ben girişiJson dizesini java

{ 
    "var": "test11", 
    "_env": { 
     "activation": "wm6a93e3a80-0307-12cc-96e6-d79883bf841a", 
     "uuid": "48cdc2d0-0212-11e6-8315-d79883bf841a", 
     "eventID": 49167, 
     "recvTime": "Thu Apr 14 00:27:03 PDT 2016" 
    } 
} 

olarak json dize altında götüren bir hizmet istiyorsanız ve

{ 
    "var": "test11" 
} 

ve

{ 
    "_env": { 
     "activation": "wm6a93e3a80-0307-12cc-96e6-d79883bf841a", 
     "uuid": "48cdc2d0-0212-11e6-8315-d79883bf841a", 
     "eventID": 49167, 
     "recvTime": "Thu Apr 14 00:27:03 PDT 2016" 
    } 
} 

sadece bir örnektir olarak çıktı tükürür. Json dizesinde daha fazla nesne içerebilir ve _env her zaman sonunda görünmez.

Jackson API'yı kullanmanın kolay bir yolu var mı?

public class Bar { 

    private String var; 

    @JsonProperty("_env") 
    private Object env; 

    public String getVar() { 
     return var; 
    } 

    public void setVar(String var) { 
     this.var = var; 
    } 

    public Object getEnv() { 
     return env; 
    } 

    public void setEnv(Object env) { 
     this.env = env; 
    } 
} 

Ve deserializing önce bilinmeyen özelliklerine başarısız değil mapper ayarlamak;:

+0

Orijinal jsondaki tüm tuşların adını ve ayırmak istediğiniz tuşları biliyor musunuz? – marrock

cevap

3

aşağıda gibi, JSON tutacak bir sınıf oluşturma _env mevcut veya olmadığında

public static void main(String[] argv) throws Exception { 
    ObjectMapper mapper = new ObjectMapper(); 
    mapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false); 

    Bar bar = mapper.readValue(JSON, Bar.class); 

} 

Bu şekilde, hem işe yarayacak. Her düğüm tarafından json "bölünmüş" gerekirse

, böyle bir şey yapabilirsiniz:

JsonNode node = mapper.readTree(JSON); 
List<String> nodeJsons = new ArrayList<>(); 
Iterator<Entry<String, JsonNode>> nodeIterator = node.fields(); 
while (nodeIterator.hasNext()) { 
    Map.Entry<String, JsonNode> entry = nodeIterator.next(); 
    nodeJsons.add(mapper.writeValueAsString(entry)); 
} 

Eğer kendisi tarafından tefrika her düğüm ile sonunda json dizeleri listesini olacak Bu şekilde Her şeyle bir "büyük" json yerine. Dinamik girişli

+0

Bence bu iyi bir cevap. –

1

, bir harita içine json yüklemek için en iyisi:

public static void main(String[] args) 
{ 
    ObjectMapper mapper = new ObjectMapper(); 
    try (Reader reader = new FileReader("C://Temp/xx.json")) { 
     // load whatever json into Map 
     @SuppressWarnings("unchecked") 
     Map<String, Object> inMap = mapper.readValue(reader, Map.class); 
     System.out.println(inMap); 
     // exmaple for generating json for each key found 
     for (String key : inMap.keySet()) { 
      mapper.writeValue(System.out, Collections.singletonMap(key, inMap.get(key))); 
     } 
    } catch (Exception e) { 
     e.printStackTrace(); 
    } 
} 

özel sınıf ve karanlık jackson yapılandırması gerek yok. Girişte olan her şey Harita'ya yüklenir. Her bir anahtar için bir json oluşturabilir veya harita içeriğini herhangi bir şekilde interaktif yapabilirsiniz

İlgili konular