2013-10-21 102 views
0

我有以下兩個Java類(SensorData,和能見度)到虛擬傳感器數據,和它們各自的能見度存儲到兩個對象:駱駝傑克遜2.12.1支持將嵌套對象編組爲嵌套JSON嗎?

SensorData.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; 
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&amp;period={{config.timeout}}" /> 
      <camel:to uri="log:hello.world.request?level=INFO&amp;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&amp;showAll=true" /> 

     </camel:route> 

</camel:camelContext> 

上週我貼在SO過類似的問題,但我張貼後實現我不得不改變我的實現,以返回一個列表駱駝而不是地圖。 How do I marshall nested key,value pairs into JSON with Camel and Jackson library?

回答

2

我不知道爲什麼你需要使用@JsonAnySetter/@JsonAnyGetter,但如果你必須嘗試這兩個類

@JsonAnySetter 
public void add(String key, String value) { 
     keyValues.put(key, value); 
} 

同時,您setKeyValues應採取Map參數。就像你現在這樣,你已經延伸了JavaBean約定。

另外,把駱駝趕出等式。編寫單元測試來測試你的配置,並確保你的對象被序列化/反序列化,然後將它們集成到Camel中,並等待運行時間才能炸燬。

+0

但是,我的兩個Java類中的keyvalues都是一個Map。而且事情並沒有被駱駝炸燬,我只是沒有把所有的數據都輸入到JSON中。 – erj2code

+0

我不明白你的第一點。通過炸燬,我的意思是不工作。我想我是危言聳聽哈哈。我的觀點是,這與駱駝無關;在容器外面測試。一般來說,這只是一個好習慣,在這種情況下,它會減少構建/測試/部署週期。 – Vidya

+0

嗯,我很困惑我在向地圖寫值時如何違反JavaBean慣例。事實上,我確實在Camel之外測試了這個代碼。我是增量構建的忠實粉絲,並且實際上在這一點上做了很小的增量。這個helloworld項目只是我們用駱駝測試的一個小測試平臺。寫一個地圖,然後把它作爲一個列表讀回來是非常簡單的事情。看來,這應該只是工作,這與駱駝傑克遜的JSON編組。 – erj2code