我有以下兩個Java類(SensorData,和能見度)到虛擬傳感器數據,和它們各自的能見度存儲到兩個對象:駱駝傑克遜2.12.1支持將嵌套對象編組爲嵌套JSON嗎?
SensorData.javapackage com.data.world2;
import java.util.Map;
import java.util.TreeMap;
import com.fasterxml.jackson.annotation.JsonAnyGetter;
import com.fasterxml.jackson.annotation.JsonAnySetter;
import com.fasterxml.jackson.annotation.JsonProperty;
public class SensorData {
private final Map<String, Object> keyvalues = new TreeMap<String, Object>();
@JsonProperty
private Visibility visibility;
// getters and setters
@JsonAnyGetter
public Map<String, Object> getKeyvalues() {
return keyvalues;
}
@JsonAnySetter
public void setKeyvalues(final String key, final Object value) {
this.keyvalues.put(key, value);
}
// getters and setters
public Visibility getVisibility() {
return visibility;
}
public void setVisibility(Visibility visibility) {
this.visibility = visibility;
}
}
Visibility.java
package com.data.world2;
import java.util.Map;
import java.util.TreeMap;
import com.fasterxml.jackson.annotation.JsonAnyGetter;
import com.fasterxml.jackson.annotation.JsonAnySetter;
public class Visibility {
private final Map<String, Object> keyvalues = new TreeMap<String, Object>();
// getters and setters
@JsonAnyGetter
public Map<String, Object> getKeyvalues() {
return keyvalues;
}
@JsonAnySetter
public void setKeyvalues(final String key, final Object value) {
this.keyvalues.put(key, value);
}
}
而在我的SensorGenerator類中,我存儲SensorData和Visibility keyvalue對象。例如,假設我有一個來自傳感器的兩個鍵值對(make和model),並且只有「make」鍵值對具有指定的可見性; 「模型」的鍵值對使用默認的知名度:
// create a sensorData object, and a visibility object
SensorData sensorData = new SensorData();
Visibility visibility = new Visibility();
sensorData.setKeyValues("s1make", "Apple"); // set sensor 1 make
visibility.setKeyValues("s1make", "public"); // set sensor 1 make visibility
sensorData.setKeyValues("s1model", "iPhone5"); // set sensor 1 model
// sensor 1 model visibility not specified
// set default visibility
visibility.setKeyValues("_default", "private"); // set default visibility for sensor keyvalue pairs
然後,我添加了可視性物體的SensorData對象來獲取嵌套的可見性:
// add the visibility to the SensorData object
sensorData.setVisibility(visibility);
更新:
的問題是,我沒有正確地將列表返回給Camel,以便編組爲JSON。
當我改變了我的代碼,我有充分的嵌套JSON整理如下:
List<SensorData> sensorDataList = new ArrayList<SensorData>();
sensorDataList.add(sensorData);
下面是以前的辦法我只好這是不正確的(這裏只是歷史信息)
而且然後我回到SensorData對象的List到我的駱駝線程編組,以JSON與傑克遜庫(駱駝 - 傑克遜):
// Build a sensorDataList based on the keyvalues stored in the SensorData object
List<SensorData> sensorDataList = new ArrayList(sensorData.getKeyvalues().entrySet());
當我運行我的Java p rogram我希望看到從我的駱駝航線以下嵌套的JSON:
[{"key":"s1make","value":Apple"},
{"key":"s1model","value":"iPhone5"},
{"visibility": {"key":"s1make","value":"public",
"key":"_default","value":"private"}
}]
但是,相反,我只看到有整理成JSON IE中:
[{"key":"s1make","value":Apple"},
{"key":"s1model","value":"iPhone5"}]
的SensorData鍵值爲什麼我不將嵌套的JSON看作「s1make」和「_default」可見性?駱駝傑克遜2.12.1不支持將嵌套對象編組爲嵌套JSON嗎?
順便說一句,這是我的applicationContext.xml的片段,我指定給編組JSON:
<camel:dataFormats>
<camel:json id="jack" library="Jackson"/>
</camel:dataFormats>
<camel:route>
<camel:from
uri="timer://hello.world.request.timer?fixedRate=true&period={{config.timeout}}" />
<camel:to uri="log:hello.world.request?level=INFO&showAll=true" />
<camel:bean ref="helloWorld" />
<camel:marshal ref ="jack"/>
<camel:convertBodyTo type="java.lang.String" />
<camel:log message="${body}"/>
<camel:log message="printing values read from config.properties file"/>
<camel:log message="config.timeout= {{config.timeout}}"/>
<camel:log message="config.numSamples= {{config.numSamples}}"/>
<camel:log message="config.defaultViz= {{config.defaultViz}}"/>
<camel:to uri="log:hello.world.response?level=INFO&showAll=true" />
</camel:route>
</camel:camelContext>
上週我貼在SO過類似的問題,但我張貼後實現我不得不改變我的實現,以返回一個列表駱駝而不是地圖。 How do I marshall nested key,value pairs into JSON with Camel and Jackson library?
但是,我的兩個Java類中的keyvalues都是一個Map。而且事情並沒有被駱駝炸燬,我只是沒有把所有的數據都輸入到JSON中。 – erj2code
我不明白你的第一點。通過炸燬,我的意思是不工作。我想我是危言聳聽哈哈。我的觀點是,這與駱駝無關;在容器外面測試。一般來說,這只是一個好習慣,在這種情況下,它會減少構建/測試/部署週期。 – Vidya
嗯,我很困惑我在向地圖寫值時如何違反JavaBean慣例。事實上,我確實在Camel之外測試了這個代碼。我是增量構建的忠實粉絲,並且實際上在這一點上做了很小的增量。這個helloworld項目只是我們用駱駝測試的一個小測試平臺。寫一個地圖,然後把它作爲一個列表讀回來是非常簡單的事情。看來,這應該只是工作,這與駱駝傑克遜的JSON編組。 – erj2code