17

I Just came across a situation where I need to put the data in the JSONObject, while doing that I received a warning from the compiler regarding.

Type safety: The method put(Object, Object) belongs to the raw type HashMap. References to generic type HashMap should be parameterized.

I tried to parameterize the JSONObject but it gave me the error.

I am using following code where option is a Object.

JSONObject additionalDetails = new JSONObject();
additionalDetails.put("showOppo", option.isShowOppo());
additionalDetails.put("showCont", option.isShowCont());
additionalDetails.put("contActionTaken", option.isConActionTaken());
additionalDetails.put("oppoActionTaken", option.isOppoActionTaken());

How is this caused and how can I solve it?

BalusC
  • 1,082,665
  • 372
  • 3,610
  • 3,555
vaibhav
  • 762
  • 2
  • 12
  • 34

5 Answers5

36

I don't know if you still have this problem, but I think it will benefit others who came across this problem.

I came across this problem and after a while, I managed to get it fixed using a HashMap.

HashMap<String,Object> additionalDetails = new HashMap<String,Object>();
additionalDetails.put("showOppo", option.isShowOppo());
additionalDetails.put("showCont", option.isShowCont());
additionalDetails.put("contActionTaken", option.isConActionTaken());
additionalDetails.put("oppoActionTaken", option.isOppoActionTaken());

JSONObject additionalDetailsJSON = new JSONObject(additionalDetails);

If you don't know what type the hashmap will hold or if it holds multiple types, its safer to use Object. Otherwise use the proper type.

This solution works on json-simple 1.1.1 and Java 1.5 and up.

Ashwin
  • 541
  • 1
  • 4
  • 7
  • 3
    When I try create a JSONObject passing HashMap in the constructor I get following - The constructor JSONObject(HashMap) is undefined. – skoriy Feb 13 '19 at 09:41
  • 2
    this should be the accepted answer in my opinion! Thanks! – Chagai Friedlander Aug 18 '20 at 09:45
  • yes this should have been the accepted answer, works like a charm and this seems correct way to do it. – Anurag Feb 16 '21 at 12:25
  • JSONObject does not seem to have a constructor that takes an object, just a plain no-arg constructor. – Keith Tyler Mar 16 '23 at 22:25
  • @KeithTyler Make sure the versions match at least (json-simple 1.1.1 and Java 1.5 and up). I have not tested on other versions of json-simple, just v1.1.1. – Ashwin Apr 05 '23 at 10:12
14

You are using JSON Simple. Its JSONObject is derived from HashMap but unfortunately doesn't use generic parameters (probably because it was created in pre-generic times). So the warnings you see are the same as in:

HashMap map = new HashMap();
map.put("showOppo", option.isShowOppo());

Unfortunately you can't avoid the warnings.

I would recommend to switch to another JSON library like GSON or Jackson.

wero
  • 32,544
  • 3
  • 59
  • 84
  • 2
    [the answer below](https://stackoverflow.com/questions/35453110/json-simple-causes-compiler-warning-type-safety-the-method-putobject-object#answer-40087076) shows how you **can** avoid the warning. – Chagai Friedlander Aug 18 '20 at 09:47
1

I recently face this problem.There are two libraries for JSONObject which is creating confusion for you You have used wrong json jar that is json-simple-1.1.jar, package that you imported is org.json.simple.JSONObject, use java-json.jar and import org.json.JSONObject download jar from http://www.java2s.com/Code/Jar/j/Downloadjavajsonjar.htm

Amit Yadav
  • 406
  • 2
  • 11
  • i am starting to feel that people should be directed away from jsonsimple. One big issue is the poor package naming that collides with the actual json.org java implementation. Makes it impossible / daunting to use both libraries. But it is just not robust or clean. – Keith Tyler Mar 16 '23 at 22:27
1

to avoid the warning and to better work I change it like that (when JSONObject additionalDetails)

import com.jayway.jsonpath.JsonPath;

 JsonPath.parse(additionalDetails).set(fieldPath, Value);
Vladi
  • 1,662
  • 19
  • 30
0

If option.isShowOppo() is returning boolean value. Try Boolean value= option.isShowOppo(); and then additionalDetails.put("showOppo",value);

Shono
  • 57
  • 8