0

Project: Android app using REST web service
Using:
Client - Volley
Server API - Jersey
Converter: Gson

This is my first time asking a question here, and i will provide my way of "evading" this code convention. Since i am working on a project where POJO fields are already defined as upper-case (sadly, i cant change that), i had to find a way to fix JSON string and convert it to an instance of uppercase POJO.

So basicaly its: client POJO <--> json object converted to/from gson <--> server POJO

So, lets say that i have a field in Users.class

String USERNAME;

When Jersey sends an instance of via @Produces, it follows the convention of creating JSON and sends an object

{"username": "random_name"}

When it gets converted from JSON via gson.fromJSON, an instance of a client's POJO will get null value for that field (obviously because field is in lower-case in JSONObject).

This is how i managed it by using a method that parses JSONObject and puts each key as upper-case:

public static String fixJSONObject(JSONObject obj) {
    String jsonString = obj.toString();
    for(int i = 0; i<obj.names().length(); i++){
        try{
      obj.names().getString(i).toUpperCase());
           jsonString=jsonString.replace(obj.names().getString(i),
           obj.names().getString(i).toUpperCase());

        } catch(JSONException e) {
            e.printStackTrace();
        }
    }
    return jsonString;
}

And luckily since gson.fromJSON() requires String (not a JSONObject) as a parameter besides Class, i managed to solve the problem this way.

So, my question would be: Is there any elegant way of making JSON ignore that code convention and create a JSON object with an exact field? In this case:

 {"USERNAME": "random_name"}
Sekula1991
  • 288
  • 4
  • 17

2 Answers2

2

Jersey uses JAXB internally to marshall beans to xml/json. So you can always use @XmlElement annotation and use name attribute to set the attribute name to be used for marshalling

@XmlElement(name="USERNAME")
String USERNAME;
Juned Ahsan
  • 67,789
  • 12
  • 98
  • 136
1

Just use annotation com.google.gson.annotations.SerializedName Add in class Users.java:

@SerializedName("username")
String USERNAME;
ArtKorchagin
  • 4,801
  • 13
  • 42
  • 58