camel jackson 2.12.1是否支持将嵌套对象编组为嵌套JSON?

camel jackson 2.12.1是否支持将嵌套对象编组为嵌套JSON?,json,list,jackson,apache-camel,Json,List,Jackson,Apache Camel,我有以下两个Java类(SensorData和Visibility)来存储虚拟传感器数据,并将其各自的可见性存储到两个对象中: SensorData.java 然后,我将可见性对象添加到SensorData对象以获得嵌套的可见性: // add the visibility to the SensorData object sensorData.setVisibility(visibility); 更新: 问题是我没有正确地将列表返回给Camel,以便编组为JSON 当我将

我有以下两个Java类(SensorData和Visibility)来存储虚拟传感器数据,并将其各自的可见性存储到两个对象中:

SensorData.java 然后,我将可见性对象添加到SensorData对象以获得嵌套的可见性:

    // add the visibility to the SensorData object 
    sensorData.setVisibility(visibility); 
更新: 问题是我没有正确地将列表返回给Camel,以便编组为JSON

当我将代码更改为以下内容时,我已对完整的嵌套JSON进行了封送:

 List<SensorData> sensorDataList = new ArrayList<SensorData>();
 sensorDataList.add(sensorData);
但是,我只看到SensorData键值被编组为JSON,即:

[{"key":"s1make","value":Apple"}, 
 {"key":"s1model","value":"iPhone5"}] 
为什么我不把“s1make”和“_default”可视性看作嵌套的JSON?camel jackson 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上发布了一个类似的问题,但在发布后意识到,我必须更改我的实现,将列表而不是地图返回给Camel。

我不知道为什么需要使用
@JsonAnySetter/@JsonAnyGetter
,但如果必须,请在这两个类中都尝试

@JsonAnySetter 
public void add(String key, String value) {
      keyValues.put(key, value);
}
同时,您的
setKeyValues
应该采用
Map
参数。现在,您已经扩展了JavaBean约定


另外,将Camel从等式中去掉。编写单元测试来测试您的配置,并确保在将对象集成到Camel中并等待运行时发生故障之前,您的对象按预期进行了序列化/反序列化。

但是,这两个Java类中的my KeyValue都是映射。事情并没有因为Camel而爆炸,我只是没有把所有的数据都转换成JSON。我不明白你的第一点。我说的爆炸是指不工作。我想我是个危言耸听的人哈哈。我的观点是,这与骆驼无关;在容器外进行测试。一般来说,这只是一个好的实践,在本例中,它缩短了构建/测试/部署周期。事实上,我首先在Camel之外测试了这段代码。我是增量构建的忠实粉丝,到目前为止,我已经做了一些小的增量构建。这个helloworld项目只是一个小型测试平台,供我们使用Camel进行测试。写一张地图,然后把它作为列表读回来,这是一件非常简单的事情。看来用camel-jackson将其整理成JSON应该行得通。我不是想挑战您的流程。那么你是说如果你只是在单元测试或
main
方法中使用普通的Jackson,那么一切都按预期工作?如果是这样的话,那么您需要确保camel jackson依赖于您测试的jackson版本,并且它们可以一起工作。至于JavaBean的东西,
@JsonProperty
@JsonAnySetter
不同,我很确定他们期望不同的东西。看看这个:
    // Build a sensorDataList based on the keyvalues stored in the SensorData object 
    List<SensorData> sensorDataList = new ArrayList(sensorData.getKeyvalues().entrySet()); 
[{"key":"s1make","value":Apple"}, 
 {"key":"s1model","value":"iPhone5"}, 
 {"visibility": {"key":"s1make","value":"public", 
                 "key":"_default","value":"private"} 
}] 
[{"key":"s1make","value":Apple"}, 
 {"key":"s1model","value":"iPhone5"}] 
      <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>
@JsonAnySetter 
public void add(String key, String value) {
      keyValues.put(key, value);
}