2013-10-15 24 views
5

Şu anda bir iç içe geçmiş anahtar, değer çiftleri ve Jackson kütüphane marshallları olmadan sadece Jackson kütüphanesi kullanılarak JSON'a ince ayar yapmadan Camel'e bir harita döndüren bir Java projem var.Camel ve Jackson kitaplığı ile JSON'a anahtar yuva, değer çiftlerini nasıl yerleştiririm?

Map<String,String> demoMap = new TreeMap<String,String> 
demoMap.put("key1","5"); 
demoMap.put("key2","10"); 

aşağıdaki JSON olsun: Ben şu iki anahtar koymak Örneğin

, bir demoMap içine değerleri şimdi, Ancak benim anahtarı bazı

{"key1":"5","key2":"10"} 

, değer girişleri olacak Haritanızda yuvalanmış anahtar değer olarak koymam gereken isteğe bağlı görünürlük var. Herhangi bir anahtar, isteğe bağlı bir görünüme sahip olmayan değerler varsayılanı kullanır. Yani, örneğin ben anahtar1 ve anahtarındaki2 için görünürlük belirtmek, ama bu şuna benzer dışarı ben JSON almak istiyorum anahtar3 değilse:

{"key1":"5", 
"key2":"10", 
"key3":"17", 
"visibility" : { "key1": "a&b&!c", "key2": "a&b", "_default": "a" } 
} 

nasıl iç içe anahtar, değeri ile Marshall'a için bir Java nesnesini Camel alabilirsiniz çiftleri? Ben bir görsel öğreniciyim, bu yüzden basit bir örnek yardımcı olacaktır.

Ben bir nesne yani ,:

Map<String,Object> demoMap = new TreeMap<String,Object> 

gibi bir değere sahip benim Haritası değişen ve daha sonra çalıştı başvuru için http://examples.javacodegeeks.com/core-java/json/jackson/convert-java-map-to-from-json-using-jackson-example/ kullanarak bir ArrayList ile bazı anahtarlar için, değerleri iç içe anahtarı ekleyerek, ama bu sadece fark çalıştı bana bir anahtarın iç içe geçmiş değerlerini, bir çift yuvalanmış anahtar, değer çiftlerini değil. Ben sırıtıyor için çalıştı

bile, ben java.lang.String

benzer

Ve ne zaman I döküm edilemez java.util.ArrayList belirten bir java.lang.ClassCastException ile Deve işlemcisi bir hata var Bu yüzden bunu yapmak için değil biliyorum

3244 [hello.world.request.timer] ERROR org.apache.camel.processor.DefaultErrorHandler - Failed delivery for exchangeId: e6518e39-89b7-435e-96d9-ce26811ac67e. Exhausted after delivery attempt: 1 caught: java.lang.ClassCastException: java.util.HashMap cannot be cast to java.lang.String 

: yuva çalıştı benim demoMap içinde bir haritada bu ClassCastException var. : -/

http://camel.apache.org/json.html adresindeki Camel JSON belgelerini okudum, ancak bu yazıdan sonra yuvalanmış anahtar, değer çiftleri içeren bir örnek belirtmiyor.

GÜNCELLEME: Şu anda

package sample; 

import java.util.Map; 
import java.util.Properties; 
import java.util.TreeMap; 

import org.codehaus.jackson.annotate.JsonAnyGetter; 
import org.codehaus.jackson.annotate.JsonProperty; 

public class SensorGenerator { 

    private Properties sourceProperties; 

    // create a map of sensor keyvalues, and a map of sensor visibility 
    Map<String,String> keyvalues = new TreeMap<String,String>(); 
    @JsonProperty 
    Map<String,String> visibility = new TreeMap<String,String>(); 

    @JsonAnyGetter 
    public Map<String, String> getKeyvalues() { 

     for (Object key : sourceProperties.keySet()) { 

      // Separate out each of the field:datatype:visibility tuples as an entry in the 
      // values array 
      String[] values = sourceProperties.getProperty((String) key).split(
        ","); 
      // split the key between 'sensor' and the 'number' Ex: sensor1 -> sensor,1 
      String[] keyArray = key.toString().split("(?<=([a-zA-Z]++))"); 
      String keyNumber = keyArray[1]; // grab the number to append for each sensor 

      // define string buffer that appends sensor number for each sensor's 
      // keys. Ex: sensor1 would have s1make, s1makeDataType, etc. 
      StringBuffer sensorNumberStringBuffer = new StringBuffer(); 
      sensorNumberStringBuffer.append("s"); 
      sensorNumberStringBuffer.append(keyNumber); 

      // make, its data type, and visibility (with s# prefix) 
      StringBuffer makeStringBuffer = new StringBuffer(); 
      makeStringBuffer.append(sensorNumberStringBuffer); 
      makeStringBuffer.append("make"); 
      StringBuffer makeDataTypeStringBuffer = new StringBuffer(); 
      makeDataTypeStringBuffer.append(sensorNumberStringBuffer); 
      makeDataTypeStringBuffer.append("makeDataType"); 
      StringBuffer makeVizStringBuffer = new StringBuffer(); 
      makeVizStringBuffer.append(sensorNumberStringBuffer); 
      makeVizStringBuffer.append("makeViz"); 

      // model, its data type, and visibility (with s# prefix) 
      StringBuffer modelStringBuffer = new StringBuffer(); 
      modelStringBuffer.append(sensorNumberStringBuffer); 
      modelStringBuffer.append("model"); 
      StringBuffer modelDataTypeStringBuffer = new StringBuffer(); 
      modelDataTypeStringBuffer.append(sensorNumberStringBuffer); 
      modelDataTypeStringBuffer.append("modelDataType"); 
      StringBuffer modelVizStringBuffer = new StringBuffer(); 
      modelVizStringBuffer.append(sensorNumberStringBuffer); 
      modelVizStringBuffer.append("modelViz"); 

      // serialNumber, its data type, and visibility (with s# prefix) 
      StringBuffer serialNumberStringBuffer = new StringBuffer(); 
      serialNumberStringBuffer.append(sensorNumberStringBuffer); 
      serialNumberStringBuffer.append("serialNumber"); 
      StringBuffer serialNumberDataTypeStringBuffer = new StringBuffer(); 
      serialNumberDataTypeStringBuffer.append(sensorNumberStringBuffer); 
      serialNumberDataTypeStringBuffer.append("serialNumberDataType"); 
      StringBuffer serialNumberVizStringBuffer = new StringBuffer(); 
      serialNumberVizStringBuffer.append(sensorNumberStringBuffer); 
      serialNumberVizStringBuffer.append("serialNumberViz"); 

      // sensorType, its data type, and visibility (with s# prefix) 
      StringBuffer sensorTypeStringBuffer = new StringBuffer(); 
      sensorTypeStringBuffer.append(sensorNumberStringBuffer); 
      sensorTypeStringBuffer.append("sensorType"); 
      StringBuffer sensorTypeDataTypeStringBuffer = new StringBuffer(); 
      sensorTypeDataTypeStringBuffer.append(sensorNumberStringBuffer); 
      sensorTypeDataTypeStringBuffer.append("sensorTypeDataType"); 
      StringBuffer sensorTypeVizStringBuffer = new StringBuffer(); 
      sensorTypeVizStringBuffer.append(sensorNumberStringBuffer); 
      sensorTypeVizStringBuffer.append("sensorTypeViz"); 

      // put all the field:datatype keyvalues for this sensor in the keyvalues map 
      // and visibilities in the visibility map 

      // make, data type, and visibility 
      keyvalues.put(makeStringBuffer.toString(), values[0].split(":")[0]); 
      keyvalues.put(makeDataTypeStringBuffer.toString(), values[0].split(":")[1]); 
      visibility.put(makeVizStringBuffer.toString(), values[0].split(":")[2]); 

      // model, data type, and visibility 
      keyvalues.put(modelStringBuffer.toString(), values[1].split(":")[0]); 
      keyvalues.put(modelDataTypeStringBuffer.toString(), values[1].split(":")[1]); 
      visibility.put(modelVizStringBuffer.toString(), values[1].split(":")[2]); 

      // serialNumber, data type, and visibility 
      keyvalues.put(serialNumberStringBuffer.toString(), values[2].split(":")[0]); 
      keyvalues.put(serialNumberDataTypeStringBuffer.toString(), values[2].split(":")[1]); 
      visibility.put(serialNumberVizStringBuffer.toString(), values[2].split(":")[2]); 

      // sensorType, data type, and visibility 
      keyvalues.put(sensorTypeStringBuffer.toString(), values[3].split(":")[0]); 
      keyvalues.put(sensorTypeDataTypeStringBuffer.toString(), values[3].split(":")[1]); 
      visibility.put(sensorTypeVizStringBuffer.toString(), values[3].split(":")[2]); 

      // add in default visibility 
      visibility.put("_default", "a"); 

     } 
     return keyvalues; 
    } 

    public void setSourceProperties(Properties properties) { 
     this.sourceProperties = properties; 
    } 

} 

: Tom geri bildirimlere dayanarak ben yani iki Maps, İşte

Map<String,String> keyvalues = new TreeMap<String,String>(); 
Map<String,String> visibility = new TreeMap<String,String>(); 

bir özellikler bir harita dosyasını yükler Ben SensorGenerator diyoruz benim sınıftır oluşturulan Sadece varsayılan görünürlüğü "a" ile kodladım, ancak daha sonra bir özellik dosyasından da çekileceğini değiştireceğim.

cevap

6

Yapınız bir haritadan daha fazlasıdır. Farklılaştırılmış iki harita. Bu temsil etmenin bir yolu olduğunu:

public class Whatever{ 
    Map<String,String> keyvalues; 
    Map<String,String> visibility; 
} 

Ne idealden çok uzak olmasına rağmen verileri temsil ettiği bu böyle, ile bitireceğiz:

{ 
"keyvalues" : { "key1": "5", "key2": "10", "key3": "17"}, 
"visibility" : { "key1": "a&b&!c", "key2": "a&b", "_default": "a" } 
} 

istediğini, kullanmak almak için @JsonAnyGetter .Böyle bir şey (kullanımı çok daha kolay yapılmış olabilir):

public class Whatever{ 
    Map<String,String> keyvalues = new TreeMap<String,String>(); 
    @JsonProperty 
    Map<String,String> visibility = new TreeMap<String,String>(); 

    @JsonAnyGetter 
    public Map<String, String> getKeyvalues() { 
     return keyvalues; 
    } 
} 

üretir:

  {"visibility":{"key1":"a&b&!c","key2":"a&b"},"key1":"5","key2":"10"} 

Bunu bugün mücadele ettik ve soru kanlı iş yapmak için bana ilham: D ek açıklamaları burada: burada https://github.com/FasterXML/jackson-annotations/wiki/Jackson-Annotations

bakınız JUnit testi: https://gist.github.com/TomDemeranville/7009250

+0

Tom bilgiler için teşekkür ederim. Önerilen kodu ekledim, ancak programı çalıştırdığımda sadece JSON'daki anahtar değerleri görüyorum. Nedense yuvalanmış görünürlük alanlarını göremiyorum. SensorGenerator.java sınıfımı ekleyeceğim, belki de bir şey kaçırıyorum :-) – erj2code

+0

burada bir JUnit testi olarak. Bu sınav benim için çalışıyor. Hangi versiyonu kullanıyorsunuz Jackson? https://gist.github.com/TomDemeranville/7009250 – tom

+0

Ben camel-jackson kullanıyorum 2.12.1. Benim pom.xml'Bu aşağıdaki bağımlılığı: \t \t \t \t \t org.apache.camel \t \t \t deve-jackson \t \t \t $ {deve} \t \t nerede Yukarıdaki $ {camel} öğesini 2.12.1 – erj2code

İlgili konular