Hi Rajeenthini,

You are hoping to add the following code snippet to the serializeJSON
method [1] of the org.jaggeryjs.scriptengine.util.HostObjectUtil class.

>     String JsonString = null;
>     try{
>         ObjectMapper mapper = new ObjectMapper();
>         JsonString = mapper.writeValueAsString(obj);
>     }catch (Exception e){
>         System.out.println(e.getMessage());
>     }
>
>     return "{\"javaObject\":\"true\",\"object\":\"" + JsonString + "\"}";
>
> There are few issue in this code snippet.

   - Don't catch generic Exception, always catch a specific exception. In
   here you should catch JsonProcessingException [2].
   - Don't use System.out.println to log exceptions. Instead use a proper
   logger. HostObjectUtil class has a log object defined in line 30 [3],
   you can use that.
   - Returning '{"javaObject": "true", "object": "{ ... }"}' string gives a
   wrong impression that there are two attributes called 'javaObject' &
   'object' in the logged object. I think just returning the JSON string will
   be enough.

After corrections (I also took the liberty to reduce no of lines):

try {

return (new ObjectMapper()).writeValueAsString(obj);

} catch (JsonProcessingException e) {

log.debug("Object " + obj.toString() + " of class " + obj.getClassName() +
" cannot be converted to JSON");

}

return "{}";


[1]
https://github.com/wso2/jaggery/blob/master/components/script-engine/org.jaggeryjs.scriptengine/src/main/java/org/jaggeryjs/scriptengine/util/HostObjectUtil.java#L78
[2]
https://static.javadoc.io/com.fasterxml.jackson.core/jackson-databind/2.6.3/com/fasterxml/jackson/databind/ObjectMapper.html#writeValueAsString(java.lang.Object)
[3]
https://github.com/wso2/jaggery/blob/master/components/script-engine/org.jaggeryjs.scriptengine/src/main/java/org/jaggeryjs/scriptengine/util/HostObjectUtil.java#L30

Thanks.


On Mon, Feb 1, 2016 at 8:13 PM, Rajeenthini Satkunam <[email protected]>
wrote:

> Hi sajith,
>
> i have added this Student class for example.As for current implementation
> goes like this way in Jaggery below.
>
> public static String serializeJSON(Object obj) {
>     if (obj instanceof Wrapper) {
>         obj = ((Wrapper) obj).unwrap();
>     }
>     if (obj == null) {
>         return "null";
>     }
>     if (obj instanceof Undefined) {
>         return "null";
>     }
>     if (obj instanceof Boolean) {
>         return Boolean.toString((Boolean) obj);
>     }
>     if (obj instanceof String) {
>         return serializeString((String) obj);
>     }
>     if (obj instanceof ConsString) {
>         return serializeString(obj.toString());
>     }
>     if (obj instanceof Number) {
>         return obj.toString();
>     }
>     if (obj instanceof XMLObject) {
>         return serializeString(serializeXML((ScriptableObject) obj));
>     }
>     if (obj instanceof NativeObject) {
>         return serializeNativeObject((NativeObject) obj);
>     }
>     if (obj instanceof NativeArray) {
>         return serializeNativeArray((NativeArray) obj);
>     }
>     if (obj instanceof Object[]) {
>         return serializeObjectArray((Object[]) obj);
>     }
>     if (obj instanceof Scriptable) {
>         Scriptable object = (Scriptable) obj;
>         String jsClass = object.getClassName();
>         if ("Date".equals(jsClass)) {
>             return serializeString(serializeNativeDate(object));
>         } else if ("Error".equals(jsClass)) {
>             return serializeString(serializeNativeError(object));
>         }
>     }
>     String JsonString = null;
>     try{
>         ObjectMapper mapper = new ObjectMapper();
>         JsonString = mapper.writeValueAsString(obj);
>     }catch (Exception e){
>         System.out.println(e.getMessage());
>     }
>
>     return "{\"javaObject\":\"true\",\"object\":\"" + JsonString + "\"}";
> }
>
> AFAIU since we are parsing Object type of argument It is better we can use
> ObjectMapper.Correct me If I am wrong.Your suggestion would be more
> appreciated.
>
> On Sun, Jan 31, 2016 at 10:23 AM, Sajith Ariyarathna <[email protected]>
> wrote:
>
>> Hi Rajeenthini,
>>
>> AFAIK ability to convert a POJO into JSON object does nor affect the
>> output of a Jaggery Log of that POJO.
>> To get a proper log output for a Java object, you need to implement the
>> "toString" method in that Java class. For example in your case,
>>
>> public class Student {
>>
>> ...
>>
>> public String toString() {
>>
>> return "{name: " + this.name + ", age: " + this.age + ", indexNo: " +
>> this.indexNo + "}";
>>
>> }
>>
>> }
>>
>> Now you can log a Student object in your Jaggery code as following.
>>
>> log.info(studentObj.toString());
>>
>>
>> Thanks.
>>
>>
>>
>> On Sat, Jan 30, 2016 at 9:28 PM, Rajeenthini Satkunam <
>> [email protected]> wrote:
>>
>>> Hi,
>>>
>>> I have worked on writing Jaggery test for Jaggery-Product.I can observe
>>> when we tried to log the object it always gives us empty JSON
>>> ({}).Currently the implementation goes this way when we try to log java
>>> object.
>>>
>>> So I was trying to get rid of this observed behavior of Jaggery.I have
>>> gone through a solution.
>>>
>>> *using Jackson[1] *
>>>
>>> We can convert java object to JSON[2] and can log it.
>>>
>>> I have shared the piece of code I have tried out with Jackson below.
>>>
>>> *Simple POJO Student class*
>>>
>>> public class Student {
>>>     private int age;
>>>     private String name;
>>>     private String indexNo;
>>>
>>>     public int getAge() {
>>>         return age;
>>>     }
>>>
>>>     public void setAge(int age) {
>>>         this.age = age;
>>>     }
>>>
>>>     public String getName() {
>>>         return name;
>>>     }
>>>
>>>     public void setName(String name) {
>>>         this.name = name;
>>>     }
>>>
>>>     public String getIndexNo() {
>>>         return indexNo;
>>>     }
>>>
>>>     public void setIndexNo(String indexNo) {
>>>         this.indexNo = indexNo;
>>>     }
>>> }
>>>
>>> *Simple class to test Jackson*
>>>
>>> import com.fasterxml.jackson.databind.ObjectMapper;
>>> import util.Student;
>>> public class MyTest {
>>>     public static void main(String args[]){
>>>         Student st = new Student();
>>>         st.setIndexNo("DS001");
>>>         st.setAge(12);
>>>         st.setName("kareena");
>>>         try{
>>>             ObjectMapper mapper = new ObjectMapper();
>>>             String jsonInString = mapper.writeValueAsString(st);
>>>             
>>> System.out.println("************************************************");
>>>             System.out.println(jsonInString);
>>>             
>>> System.out.println("************************************************");
>>>
>>>         }catch(Exception e){
>>>             System.out.print("Exception caught  "+ e);
>>>         }
>>>
>>>     }
>>> }
>>>
>>> Actual output by above code.
>>> ************************************************
>>> {"age":12,"name":"kareena","indexNo":"DS001"}
>>> ************************************************
>>>
>>> I have added a dependency in the POM.xml
>>>
>>> <dependency>
>>>     <groupId>com.fasterxml.jackson.core</groupId>
>>>     <artifactId>jackson-databind</artifactId>
>>>     <version>2.6.3</version>
>>> </dependency>
>>>
>>>
>>> IMHO we can use the same scenario in case of log JAVA object.Your help
>>> and suggestions are more appreciated and guide me if I am wrong or I can
>>> have better solution than this.
>>>
>>> [1] - https://github.com/FasterXML/jackson-databind
>>> [2] -
>>> http://www.mkyong.com/java/how-to-convert-java-object-to-from-json-jackson/
>>> --
>>>
>>> *Thank You.*
>>>
>>> *Rajeenthini Satkunam*
>>>
>>> *Associate Software Engineer | WSO2*
>>>
>>>
>>> *E:[email protected] <[email protected]>*
>>>
>>> *M :+94770832823 <%2B94770832823>   *
>>>
>>>
>>> _______________________________________________
>>> Dev mailing list
>>> [email protected]
>>> http://wso2.org/cgi-bin/mailman/listinfo/dev
>>>
>>>
>>
>>
>> --
>> Sajith Ariyarathna
>> Software Engineer; WSO2, Inc.;  http://wso2.com/
>> mobile: +94 77 6602284, +94 71 3951048
>>
>
>
>
> --
>
> *Thank You.*
>
> *Rajeenthini Satkunam*
>
> *Associate Software Engineer | WSO2*
>
>
> *E:[email protected] <[email protected]>*
>
> *M :+94770832823 <%2B94770832823>   *
>
>


-- 
Sajith Ariyarathna
Software Engineer; WSO2, Inc.;  http://wso2.com/
_______________________________________________
Dev mailing list
[email protected]
http://wso2.org/cgi-bin/mailman/listinfo/dev

Reply via email to