camel jackson 2.12.1是否支持将嵌套对象编组为嵌套JSON?
我有以下两个Java类(SensorData和Visibility)来存储虚拟传感器数据,并将其各自的可见性存储到两个对象中: SensorData.java 然后,我将可见性对象添加到SensorData对象以获得嵌套的可见性: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 当我将
// 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&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上发布了一个类似的问题,但在发布后意识到,我必须更改我的实现,将列表而不是地图返回给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&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>
@JsonAnySetter
public void add(String key, String value) {
keyValues.put(key, value);
}