Ş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
benzerVe 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.
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
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
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