Welcome!

Linux Containers Authors: Elizabeth White, Zakia Bouachraoui, Yeshim Deniz, Pat Romanski, Liz McMillan

Related Topics: Java IoT, Open Source Cloud

Java IoT: Article

JSON Serialization with Appcelerator Java Services

Serializing/transforming model objects is really easy to do with Appcelerator IModelObjects

The issue of serializing/transforming model objects is not new, heck I’ve been doing this for quite some time:

  • RMI (ejb/corba)
  • XML (jms, soap, etc..)
  • JSON 
JSON is not the only way to serialize objects for Web 2.0 applications, but it's the most abundant and heavily used throughout the Appclerator framework. Doing this is actually really easy to do with Appcelerator IModelObjects. Our IModelObjects can easily be used along with Hibernate for persistance, but let's leave that for later for now.

When you define your Model classes, there are some very simple things to keep in mind:
  • annotate your attributes with @MessageAttr
  • have your class implement IModelObject

Here is a simple example:

<public class User implements IModelObject, Serializable {
private static final long serialVersionUID = 1L;
@MessageAttr
public String name;

public void setUsername(String username) {
this.username = username;
}
public void setPassword(String password) {
this.password = password;
}
...
}

Unit test it

Now to test the rendering of our object to JSON with a simple junit test…. As you can see, we leverage the Appcelerator framework to serialize our objects to JSON

public class ForumTest extends TestCase {
 
public void testSimple() {
User user = createUser();
Message message = new Message();
JSONMessageDataObject data = new JSONMessageDataObject();
message.setData(data);
message.getData().put("user", user);
message.getData().put("count", 1);
String messagestr = data.toDataString();
assertEquals(messagestr,"\"user\":{\"password\":
\"pwd\",\"threads\":0,\"fullName\"
:\"antewew\",\"username\":\"azuercher\",\"state\":
\"mystate\",\"email\":\"email\",
\"posts\":0,\"id\":0},\"count\":1}");
}
private User createUser() {
User user = new User();
user.setEmail("email");
user.setFullName("ante wew");
user.setId(new Long(0));
user.setPassword("pwd");
user.setPosts(new Long(0));
user.setState("mystate");
user.setThreads(new Long(0));
user.setUsername("azuercher");
return user;
}
}

Dealing with recursion

Whats always a bit of a tangle is understanding how to deal with the recursive/circular relationship.
If you take a look at JSONObject you will see 2 overridden methods for createBean

public static JSONObject createBean(IModelObject object,MessageAttr
    parentAtt, String context,String[] parentSuppres,int level, int maxlevels)
public static JSONObject createBean(IModelObject object)

The latter is obviously a bit more simple, but the former is where the power is. In the MessageAttr annotation, you can provide the suppress attribute which is a comma separated list of aggregates (using bean.name notation to not serialize). This is used for attributes in your IModelObject implementation where the association is with another IModelObject. The following model is for a forum object model where the following aggregate hierarchy exists:

* Forum
** ForumThread
*** Post

In the snippet below, I’ve omitted the getter/setter methods for the aggregates for simplicity.

public class User implements IModelObject, Serializable {
@MessageAttr (suppress="user,thread.lastPost")
public Post lastPost;
}
public class Post implements IModelObject, Serializable {
@MessageAttr(suppress="lastPost,forum.lastPost")
public Forumthread thread;
 
@MessageAttr (suppress="lastPost")
public User user;
}
public class Forumthread implements IModelObject, Serializable {
@MessageAttr (suppress="lastPost")
public Forum forum;
@MessageAttr (suppress="thread,user.lastPost")
public Post lastPost;
}
public class Forum implements IModelObject, Serializable {
@MessageAttr (suppress="thread.forum,thread.lastPost,user.lastPost")
public Post lastPost;
}

Rolling your own serialization

Assuming you know what your JSON string is going to look like, you can use our RawMessageDataList and RawMessageDataObject to serialze your objects. This is pretty useful if you already are rendering JSON in an existing framework and don’t want to have to transform to and back again. The snippet below shows with static strings just so that you get the idea:

IMessageDataList people = new
RawMessageDataList(
"[{'name':'joe','age':22},{'name':'jane','age':33}]");
IMessageDataList dog = new RawMessageDataObject("{'breed':'doberman','weight':78}");
Message message = new Message();
message.setData(new JSONMessageDataObject());
message.getData().put("people", people);
message.getData().put("dog", dog);

Using Coarse Grained objects

This is probably the simplest/prettiest way to implement your services assuming that you aren’t interested in using fine grained classes that are associated with most of today’s persistence frameworks. Here is how you would create a single compound JSON object:

IMessageDataObject dog =
MessageUtils.createMessageDataObject();
obj.put("breed","doberman");
obj.put("wieght",78);Message message = new Message();
message.setData(new JSONMessageDataObject());
message.getData().put("dog", dog);

and now with a collection:

IMessageDataList&lt;IMessageDataObject&gt; people=
MessageUtils.createMessageDataObjectList();
IMessageDataObject joe =
MessageUtils.createMessageDataObject();
joe.put("name","joe");
joe.put("age",22);
IMessageDataObject jane =
MessageUtils.createMessageDataObject();
joe.put("name","jane");
joe.put("age",33);
people.put(joe);
people.put(jane);
Message message = new Message();
message.setData(new JSONMessageDataObject());
message.getData().put("people", people);

Summary

As you can see there are quite a bit of alternatives for you based on what your needs are to accommodate your service implementations. I’ve personally used all of the above as I’ve implemented:

  • Model Objects: using Hibernate for persistence
  • Custom Serialization: for integrating with pre-rendered objects (commons-monitoring)
  • Coarse Grained: in implementing a dashboard/event driven solution

More Stories By Andrew Zuercher

Andrew Zuercher is an Enterprise Architect at Appcelerator, advocating the implementation of RIA with agile methodologies.

Comments (3) View Comments

Share your thoughts on this story.

Add your comment
You must be signed in to add a comment. Sign-in | Register

In accordance with our Comment Policy, we encourage comments that are on topic, relevant and to-the-point. We will remove comments that include profanity, personal attacks, racial slurs, threats of violence, or other inappropriate material that violates our Terms and Conditions, and will block users who make repeated violations. We ask all readers to expect diversity of opinion and to treat one another with dignity and respect.


Most Recent Comments
Duty Editor 02/18/08 12:10:16 PM EST

No problem Andrew, we've taken cxare of it.

andrew zuercher 02/18/08 11:04:17 AM EST

to dove tail on the feedback that i left last friday, i was wondering if you could corect the reference to http://zuerchtech.com instead of http://zuerchertech.com which is not associated with me whatsoever.

much thanks,

-andrew zuercher

Andrew Zuercher 02/15/08 07:21:51 PM EST

Thanks for publishing this article which is also cross posted at:
* http://www.appcelerant.com/json-serialization-with-appcelerator-java-ser...
* http://zuerchtech.com/2008/2/8/json-serialization-with-appcelerator-java...

Please note, that although I ran Zuercher Technologies based out of Atlanta, GA I have since dissolved it and now am employed at Appcelerator (http://appcelerator.com) as an Enterprise Architect advocating the implementation of RIA with agile methodologies.

IoT & Smart Cities Stories
Disruption, Innovation, Artificial Intelligence and Machine Learning, Leadership and Management hear these words all day every day... lofty goals but how do we make it real? Add to that, that simply put, people don't like change. But what if we could implement and utilize these enterprise tools in a fast and "Non-Disruptive" way, enabling us to glean insights about our business, identify and reduce exposure, risk and liability, and secure business continuity?
DXWorldEXPO LLC announced today that Telecom Reseller has been named "Media Sponsor" of CloudEXPO | DXWorldEXPO 2018 New York, which will take place on November 11-13, 2018 in New York City, NY. Telecom Reseller reports on Unified Communications, UCaaS, BPaaS for enterprise and SMBs. They report extensively on both customer premises based solutions such as IP-PBX as well as cloud based and hosted platforms.
Digital Transformation: Preparing Cloud & IoT Security for the Age of Artificial Intelligence. As automation and artificial intelligence (AI) power solution development and delivery, many businesses need to build backend cloud capabilities. Well-poised organizations, marketing smart devices with AI and BlockChain capabilities prepare to refine compliance and regulatory capabilities in 2018. Volumes of health, financial, technical and privacy data, along with tightening compliance requirements by...
We are seeing a major migration of enterprises applications to the cloud. As cloud and business use of real time applications accelerate, legacy networks are no longer able to architecturally support cloud adoption and deliver the performance and security required by highly distributed enterprises. These outdated solutions have become more costly and complicated to implement, install, manage, and maintain.SD-WAN offers unlimited capabilities for accessing the benefits of the cloud and Internet. ...
Discussions of cloud computing have evolved in recent years from a focus on specific types of cloud, to a world of hybrid cloud, and to a world dominated by the APIs that make today's multi-cloud environments and hybrid clouds possible. In this Power Panel at 17th Cloud Expo, moderated by Conference Chair Roger Strukhoff, panelists addressed the importance of customers being able to use the specific technologies they need, through environments and ecosystems that expose their APIs to make true ...
Business professionals no longer wonder if they'll migrate to the cloud; it's now a matter of when. The cloud environment has proved to be a major force in transitioning to an agile business model that enables quick decisions and fast implementation that solidify customer relationships. And when the cloud is combined with the power of cognitive computing, it drives innovation and transformation that achieves astounding competitive advantage.
DXWorldEXPO LLC announced today that "IoT Now" was named media sponsor of CloudEXPO | DXWorldEXPO 2018 New York, which will take place on November 11-13, 2018 in New York City, NY. IoT Now explores the evolving opportunities and challenges facing CSPs, and it passes on some lessons learned from those who have taken the first steps in next-gen IoT services.
"Space Monkey by Vivent Smart Home is a product that is a distributed cloud-based edge storage network. Vivent Smart Home, our parent company, is a smart home provider that places a lot of hard drives across homes in North America," explained JT Olds, Director of Engineering, and Brandon Crowfeather, Product Manager, at Vivint Smart Home, in this SYS-CON.tv interview at @ThingsExpo, held Oct 31 – Nov 2, 2017, at the Santa Clara Convention Center in Santa Clara, CA.
In an era of historic innovation fueled by unprecedented access to data and technology, the low cost and risk of entering new markets has leveled the playing field for business. Today, any ambitious innovator can easily introduce a new application or product that can reinvent business models and transform the client experience. In their Day 2 Keynote at 19th Cloud Expo, Mercer Rowe, IBM Vice President of Strategic Alliances, and Raejeanne Skillern, Intel Vice President of Data Center Group and G...
The current age of digital transformation means that IT organizations must adapt their toolset to cover all digital experiences, beyond just the end users’. Today’s businesses can no longer focus solely on the digital interactions they manage with employees or customers; they must now contend with non-traditional factors. Whether it's the power of brand to make or break a company, the need to monitor across all locations 24/7, or the ability to proactively resolve issues, companies must adapt to...