-1

I am trying to convert the keys in my json string to camelCase..i have gone trough various posts in the stackoverflow but couldn't come to the solution..

i have a json string coming in the below format..

 {
       "tech":[
          {
             "id":"1",
             "company_name":"Microsoft",
             "country_of_origin":"USA"
          },
          {
             "id":"2",
             "company_name":"SAP",
             "country_of_origin":"Germany"
          }
       ],
       "Manufacturing":[
          {
             "id":"3",
             "company_name":"GM",
             "country_of_origin":"USA"
          },
          {
             "id":"4",
             "company_name":"BMW",
             "country_of_origin":"Germany"
          }
       ]
    }

Expected Response

 {
       "tech":[
          {
             "id":"1",
             "companyName":"Microsoft",
              "countryOfOrigin":"USA"
          },
          {
             "id":"2",
             "companyName":"SAP",
             "countryOfOrigin":"Germany"
          }
       ],
       "Manufacturing":[
          {
             "id":"3",
             "companyName":"GM",
             "countryOfOrigin":"USA"
          },
          {
             "id":"4",
             "companyName":"BMW",
             "countryOfOrigin":"Germany"
          }
       ]
    }

i have written a jsonDeserializer class based on previous post in stackoverflow..

 Gson gson = new GsonBuilder()
                    .registerTypeAdapter(UpperCaseAdapter.TYPE, new UpperCaseAdapter())
                    .create();

            Map<String, List<Company>> mapDeserialized = gson.fromJson(jsonString, UpperCaseAdapter.TYPE);
            System.out.println(mapDeserialized);

And the deserilizer

 public class UpperCaseAdapter implements JsonDeserializer<Map<String, Object>> {
        public static final Type TYPE = new TypeToken<Map<String, Object>>() {}.getType();
     
         @Override
        public Map<String, Object> deserialize(JsonElement json, Type typeOfT, JsonDeserializationContext context) throws JsonParseException {
            Map<String, Object> map = new HashMap<>();
            for (Map.Entry<String, JsonElement> entry : json.getAsJsonObject().entrySet()) {
                Object value = null;
                if (entry.getValue().isJsonPrimitive()) {
                    value = entry.getValue().getAsString();
                } else if (entry.getValue().isJsonObject()) {
                    value = context.deserialize(entry.getValue(), TYPE);
                } else if (entry.getValue().isJsonArray()) {
                    for(JsonElement jsonElement:entry.getValue().getAsJsonArray()){
                        value=context.deserialize(jsonElement,TYPE);
                    }
                } else if (entry.getValue().isJsonNull()) {
                     continue;
                }
                map.put(CaseFormat.LOWER_UNDERSCORE.to(
                        CaseFormat.LOWER_CAMEL, entry.getKey()), value);
            }
            return map;
        }
    }

Model class

  public class Company {
        private String id;
        private String compnayName;
        private String countryOfOrigin;
    }

When i use the above deserilizer though it is able to convert the keys to camle case for some json array object....i can see that it is only doing that for one jsonobject in each array and not taking other array objects in to consideration.as shown below.

 Wrong Response i am getting with above serializer(missing other jsonobjecsts and the key manufacturing is converted to lower):        
     {

       "tech="{
          "companyName=SAP",
          id=2,
          "countryOfOrigin=Germany"
       },
       "manufacturing="{
          "companyName=BMW",
          id=4,
          "countryOfOrigin=Germany"
       }
    }
 

I know there are lot of posts available in stackoverflow and i have to this extent solely based on those posts but as i am new to Java and json serilization i couldn't progress anymore...any help in this regard is greatly appreciated thanks in advance

ram
  • 41
  • 1
  • 8

1 Answers1

-1

you can use the following code to get the CamelCase string;

static public class Company {
    private String id;
    private String companyName;
    private String countryOfOrigin;

    public Company() {
    }

    public String getId() {
        return id;
    }

    public void setId(String id) {
        this.id = id;
    }

    public String getCompanyName() {
        return companyName;
    }

    public void setCompanyName(String companyName) {
        this.companyName = companyName;
    }

    public String getCountryOfOrigin() {
        return countryOfOrigin;
    }

    public void setCountryOfOrigin(String countryOfOrigin) {
        this.countryOfOrigin = countryOfOrigin;
    }
}

@Test
void t4() throws JsonProcessingException {



    ObjectMapper mapperSC = new ObjectMapper();
    mapperSC.setPropertyNamingStrategy(PropertyNamingStrategies.SNAKE_CASE);
    ObjectMapper mapper = new ObjectMapper();
    mapper.setPropertyNamingStrategy(PropertyNamingStrategies.LOWER_CAMEL_CASE);

    String data = "{ " +
            "   \"tech\":[ " +
            "      { " +
            "         \"id\":\"1\", " +
            "            \"company_name\":\"Microsoft\", " +
            "            \"country_of_origin\":\"USA\" " +
            "      }, " +
            "      { " +
            "         \"id\":\"2\", " +
            "            \"company_name\":\"SAP\", " +
            "            \"country_of_origin\":\"Germany\" " +
            "      } " +
            "      ], " +
            "      \"Manufacturing\":[ " +
            "      { " +
            "         \"id\":\"3\", " +
            "            \"company_name\":\"GM\", " +
            "            \"country_of_origin\":\"USA\" " +
            "      }, " +
            "      { " +
            "         \"id\":\"4\", " +
            "            \"company_name\":\"BMW\", " +
            "            \"country_of_origin\":\"Germany\" " +
            "      } " +
            "   ] " +
            "}";


    TypeFactory tf = mapper.getTypeFactory();
    JavaType jt = tf.constructMapType(Map.class, tf.constructType(String.class), tf.constructArrayType(Company.class));
    Object o = mapperSC.readValue(data, jt);
    System.out.println(mapper.writerWithDefaultPrettyPrinter().writeValueAsString(o));

}

The output will be;

{
  "tech" : [ {
    "id" : "1",
    "companyName" : "Microsoft",
    "countryOfOrigin" : "USA"
  }, {
    "id" : "2",
    "companyName" : "SAP",
    "countryOfOrigin" : "Germany"
  } ],
  "Manufacturing" : [ {
    "id" : "3",
    "companyName" : "GM",
    "countryOfOrigin" : "USA"
  }, {
    "id" : "4",
    "companyName" : "BMW",
    "countryOfOrigin" : "Germany"
  } ]
}
Kemal Kaplan
  • 932
  • 8
  • 21