Search code examples
jsonibm-mobilefirstmobilefirst-adaptersmobilefirst-server

ibm mobilefirst Adapter - convert JSONObject to POJO class


Anyone knows - How to convert JSONObject to POJO class?

I have created an Adapter which i would like to convert it to Pojo before i send it to Client.

1) my ResourceAdapterResource.java (Adapter)

@POST
@Path("profiles/{userid}/{password}")
@Produces({ MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML })
public JSONObject getStatus(@PathParam("userid") String userid, @PathParam("password") String password) throws IOException {

    Map<String, Object> maps = new HashMap<String,Object>();
            map.put("userid", userid);
            map.put("password",password); 

    // json Object will get the value from SOAP Adapter Service
    JSONObject obj = soapAdapterService(maps);

    /** Question here, how to add to POJO.. I have code here but not work, null values**/
        // set to Object Pojo Employee
    Employee emp = new Employee();
    emp.setUserId(String.valueOf(obj.get("userId")));
    emp.setUserStatus((String.valueOf(obj.get("userStatus")));

    // when I logging its show Empty.
    logger.info("User ID from service : " + emp.getUserId());
    logger.info("Status Id from service : " + emp.getUserStatus());


    return obj;
}

2.) Pojo Class - Employee

import java.io.Serializable;

@SuppressWarnings("serial")
public class Employee implements Serializable{
private String userid;
private String userStatus;

public String getUserid() {
        return userid;
    }

    public void setUserid(String userid) {
        this.userid= userid;
    }

    public String getUserStatus() {
        return userStatus;
    }

    public void setUserStaus(String userStatus) {
        this.userStatus= userStatus;
    }
}

When I tested using Swagger - MobileFirst Console restful testing, it return the JsonObject with successfully return Body with data from the services.

But when i check log info ( message.log ) - server logs, the status is null.

User ID from service : null Status Id from service : null

Seems its JSON Java IBM API , does it have ObjectMapper like Jackson API to map the JsonObject to POJO Class.

  1. Results from Swagger
 {
      "statusReason": "OK",
      "responseHeaders": {
        "Content-Length": "1849",
        "Content-Language": "en-US",
        "Date": "Thu, 23 Mar 2017 01:40:33 GMT",
        "X-Powered-By": "Servlet/3.0",
        "Content-Type": "text/xml; charset=utf-8"
      },
      "isSuccessful": true,
      "responseTime": 28,
      "totalTime": 33,
      "warnings": [],
      "Envelope": {
        "soapenv": "http://schemas.xmlsoap.org/soap/envelope/",
        "Body": {
          "checkEmployeeLoginResponse": {
            "a": "http://com.fndong.my/employee_Login/",
            "loginEmployeeResp": {
              "Employee": {
                "idmpuUserName": "fndong",
                "Status": "A",
                "userid": "fndong",
                "Password": "AohIeNooBHfedOVvjcYpJANgPQ1qq73WKhHvch0VQtg@=",
                "PwdCount": "1",
                "rEmail": "[email protected]"
              },
              "sessionId": "%3F",
              "statusCode": "0"
            }
          }
        }
      },
      "errors": [],
      "info": [],
      "statusCode": 200
    }

Then I followed your suggestion to cast to String:

String objUserId = (String) objectAuth.get("userid");

The Results still null, does it require to indicate the json restful result by call the body function "loginEmployeeResp", because the data JSon Object are from service SOAP.


Solution

  • Clearly your String.valueOf(obj.get("userId")) is returning null or empty, so the question is, which part of it?

    You can log obj.get("userId") and see if that is empty, in which case the response doesn't contain what you expect.

    But I suspect the issue is the String.valueOf() conversion not doing what you expect. It looks like the JSONObject in MobileFirst is com.ibm.json.java.JSONObject, and when I search on that, the example I found simply casts to String:

    emp.setUserId((String) obj.get("userId"));
    

    Edit: now that you've added the Swagger results, I'd say your obj.get("userId") probably is returning null itself. Did you check that?

    For one thing, "userId" isn't "userid". The capitalization matters.

    But more importantly, "userid" is nested deep in the JSON, so I don't think just getting it from the top level JSONObject is going to work. I think you'll have to do something like:

    JSONObject envelope = (JSONObject) obj.get("Envelope");
    JSONObject body = (JSONObject) envelope.get("Body");
    JSONObject response = (JSONObject) body.get("checkEmployeeLoginResponse");
    JSONObject resp = (JSONObject) response.get("loginEmployeeResp");
    JSONObject employee = (JSONObject) resp.get("Employee");
    emp.setUserId((String) employee.get("userid"));
    emp.setUserStatus((String) employee.get("status"));
    

    (Regrettably, with that particular IBM JSON4J, I don't think there's a way to do a more automatic unmarshalling of JSON into Java objects.)