You are viewing a plain text version of this content. The canonical link for it is here.
Posted to users@camel.apache.org by erj2code <pe...@tetraconcepts.com> on 2013/10/21 16:49:58 UTC

Does camel-jackson 2.12.1 support marshalling of nested objects into nested JSON?

I have the following two Java classes (SensorData, and Visibility) to store
dummy sensor data, and their respective visibilities into two objects:

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);
	}

}

And in my SensorGenerator class I store SensorData and Visibility keyvalue
objects.  For example, suppose I have two keyvalue pairs from a sensor (make
and model), and only the "make" keyvalue pair has a visibility specified;
the "model" keyvalue pair uses the default visibility:

	// 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

Then I added the Visibility object to the SensorData object to get nested
visibilities:

        // add the visibility to the SensorData object
        sensorData.setVisibility(visibility);

And then I return a List of SensorData objects to my Camel thread for
marshalling to JSON with the Jackson library (camel-jackson):

       // Build a sensorDataList based on the keyvalues stored in the
SensorData object
       List<SensorData> sensorDataList = new
ArrayList(sensorData.getKeyvalues().entrySet());

When I run my Java program I'd expect to see the following nested JSON from
my Camel route:

[{"key":"s1make","value":Apple"},
 {"key":"s1model","value":"iPhone5"},
 {"visibility": {"key":"s1make","value":"public",
                   "key":"_default","value":"private"}
 }]

But instead, I only see are the SensorData keyvalues marshalled into JSON
i.e.,:

[{"key":"s1make","value":Apple"},
 {"key":"s1model","value":"iPhone5"}]

How come I don't see the "s1make" and "_default" visibilities as nested
JSON?  Does camel-jackson 2.12.1 not support marshalling of nested objects
into nested JSON?

Btw, here is a snippet of my applicationContext.xml where I specify the
marshalling to JSON:

   <camel:camelContext id="HelloWorldContext">
	
          
          <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>


Last week I posted a similar question on SO, but realized after I posted it
that I had to change my implementation to return a list to Camel instead of
a map.
http://stackoverflow.com/questions/19389696/how-do-i-marshall-nested-key-value-pairs-into-json-with-camel-and-jackson-librar





--
View this message in context: http://camel.465427.n5.nabble.com/Does-camel-jackson-2-12-1-support-marshalling-of-nested-objects-into-nested-JSON-tp5741991.html
Sent from the Camel - Users mailing list archive at Nabble.com.

Re: Does camel-jackson 2.12.1 support marshalling of nested objects into nested JSON?

Posted by Claus Ibsen <cl...@gmail.com>.
Same question posted on SO with an answer
http://stackoverflow.com/questions/19498011/does-camel-jackson-2-12-1-support-marshalling-of-nested-objects-into-nested-json

On Mon, Oct 21, 2013 at 4:49 PM, erj2code <pe...@tetraconcepts.com> wrote:
> I have the following two Java classes (SensorData, and Visibility) to store
> dummy sensor data, and their respective visibilities into two objects:
>
> 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);
>         }
>
> }
>
> And in my SensorGenerator class I store SensorData and Visibility keyvalue
> objects.  For example, suppose I have two keyvalue pairs from a sensor (make
> and model), and only the "make" keyvalue pair has a visibility specified;
> the "model" keyvalue pair uses the default visibility:
>
>         // 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
>
> Then I added the Visibility object to the SensorData object to get nested
> visibilities:
>
>         // add the visibility to the SensorData object
>         sensorData.setVisibility(visibility);
>
> And then I return a List of SensorData objects to my Camel thread for
> marshalling to JSON with the Jackson library (camel-jackson):
>
>        // Build a sensorDataList based on the keyvalues stored in the
> SensorData object
>        List<SensorData> sensorDataList = new
> ArrayList(sensorData.getKeyvalues().entrySet());
>
> When I run my Java program I'd expect to see the following nested JSON from
> my Camel route:
>
> [{"key":"s1make","value":Apple"},
>  {"key":"s1model","value":"iPhone5"},
>  {"visibility": {"key":"s1make","value":"public",
>                    "key":"_default","value":"private"}
>  }]
>
> But instead, I only see are the SensorData keyvalues marshalled into JSON
> i.e.,:
>
> [{"key":"s1make","value":Apple"},
>  {"key":"s1model","value":"iPhone5"}]
>
> How come I don't see the "s1make" and "_default" visibilities as nested
> JSON?  Does camel-jackson 2.12.1 not support marshalling of nested objects
> into nested JSON?
>
> Btw, here is a snippet of my applicationContext.xml where I specify the
> marshalling to JSON:
>
>    <camel:camelContext id="HelloWorldContext">
>
>
>           <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>
>
>
> Last week I posted a similar question on SO, but realized after I posted it
> that I had to change my implementation to return a list to Camel instead of
> a map.
> http://stackoverflow.com/questions/19389696/how-do-i-marshall-nested-key-value-pairs-into-json-with-camel-and-jackson-librar
>
>
>
>
>
> --
> View this message in context: http://camel.465427.n5.nabble.com/Does-camel-jackson-2-12-1-support-marshalling-of-nested-objects-into-nested-JSON-tp5741991.html
> Sent from the Camel - Users mailing list archive at Nabble.com.



-- 
Claus Ibsen
-----------------
Red Hat, Inc.
Email: cibsen@redhat.com
Twitter: davsclaus
Blog: http://davsclaus.com
Author of Camel in Action: http://www.manning.com/ibsen