So I am using the simple json library to perform some json operations. Right now I can construct a JSONObject from a json string but I am not able to get the value from the object I created.
For example if I do something like:
String value = (String) jsonRecord.get("Key");
I will get an error saying:
java.lang.ClassCastException: org.json.simple.JSONObject cannot be cast to java.lang.String
I removed the type cast to string and it works in IntelliJ. However, when I do this at command line it gives me an error saying:
error: incompatible types: Object cannot be converted to String
The schema is as follows:
{
"myArray": {
"array": ["Decaf mocha", "Vanilla mocha", "Chai Latte"]
},
"Item": {
"string": "Decaf macha"
}
}
Update: the toString() fixed the problem. But when I tried to get the array I am getting:
java.lang.ClassCastException: org.json.simple.JSONObject cannot be cast to org.json.simple.JSONArray
Can someone please suggest how to fix the problem? Thanks!
Your value is a JSONObject, not a string. Your error message makes that quite clear. If you really want it as a string, use
String value = jsonRecord.get("Key").toString();
You can pass any object to System.out.println, not just strings, but to actually turn it to a string, you need to call toString() yourself.
However, if you're expecting an actual String as the Key, and not a JSONObject, then you should take a second look at your JSON, because you're doing something wrong.
UPDATE:
Okay, looking at your schema, I see the problem. Instead of mapping the keys to values directly, your JSON maps keys to objects which then contain values. So to get the array in the JSON you posted, instead of
value = jsonRecord.get("myArray")
you would use
JSONArray value = jsonRecord.getJSONObject("myArray").getJSONArray("array");
and for the string, you would use
String value = jsonRecord.getJSONObject("Item").getString("string");
Just need to add the current "org.json" dependency would resolve your issue as latest version holds get() method (JSONObject class) which returns Object.
Below is my maven dependency:-
<dependency>
<groupId>org.json</groupId>
<artifactId>json</artifactId>
<version>20190722</version>
</dependency>
Below is my code which performs get key operation.
public void iterateJsonObject(JSONObject jsonObj) {
jsonObj.keySet().forEach(keyStr ->
{
Object keyvalue = jsonObj.get(keyStr);
System.out.println("key: "+ keyStr + " value: " + keyvalue);
});
}
You can prevent the ClassCastException by using Generics, because Generics provide compile time checks and can be used to develop type-safe applications.
You are not converting the json record value that you are fetching into a string.
String value = String.valueOf(jsonRecord.get("Key"));
his should fix your problem. You can also use toString() method but I personally prefer String.valueOf() over it because at times toString() tends to give garbage value.
Related
I'm trying to parse a given JSON in String format, for example:
{
"id": "indeed",
"interaction_data":
"{\"data\":\"{\\\"something\\\":\\\"blabla\\\"}\",\"somethingElseNotNested\":\"Indeed\"}"
}
I'm working with Kotlin, and I called JsonPath.parse on the value above, the problem is, interaction_data is parsed as a String, instead of it being treated as a JSON as well.
So when I call read("$.interaction_data.data.something") it gives me an error, since interaction_data is treated as a String, instead of an object.
Any way around this? (other than parsing this part separately, I need to handle this generically).
Thanks!
Json interaction_data property is triple stringifyied. Why you don't try this
var jsonObject=..your json;
var jsonParsed=JSON.parse(jsonObject.interaction_data);
jsonParsed.data=JSON.parse(jsonParsed.data);
JsonObject.interaction_data=jsonParsed;
result
{
"id":"indeed",
"interaction_data":{"data"{"something":"blabla"},"somethingElseNotNested":"Indeed"}
}
I have JavaScript that parses a JSON object (object has array) and returns the value from the ZONE field.
var obj = JSON.parse(json_text);
parsed_val = obj.features[0].attributes.ZONE
I would like to convert the JavaScript code to Jython.
This is what I've tried:
from com.ibm.json.java import JSONObject
obj = JSONObject.parse(json_text)
parsed_val = obj.get('features.attributes.ZONE');
The Jython compiles, but it doesn't return a valid value (it returns None). I think this is because I haven't referenced the array properly.
How can I parse the JSON object/array using Jython to get the ZONE value?
(Jython version is 2.7.0. However, I can't seem to use Python's JSON library (normally included in Jython)).
I needed to use get() at each level of the object.
As well as specify the array's index position after the first level: [0].
from com.ibm.json.java import JSONObject
obj = JSONObject.parse(json_text)
parsed_val = obj.get("features")[0].get("attributes").get("WEEK")
Credit goes to #vikarjramun for pointing me in the right direction. Thanks.
I have a Java class with two atrributes that I convert to json using this method. I followed this other answer:
Return JSONArray instead of JSONObject, Jersey JAX-RS
public String toString(){
// takes advantage of toString() implementation to format {"a":"b"}
JsonObject json = Json.createObjectBuilder()
.add("sentence", sentence)
.add( "category", category).build();
return json.toString();
}
The String I get is encapsulated into an ArrayList of strings, and sent via HTTP (I am using Jersey):
return Response.status(200).entity(response).build();
How ever, the node client is use cannot parse it properly: it gets the array part, accesses the elements perfectly. But not the json keys and values;
returns undefined:
jsonRespuesta = JSON.parse(body)[0];
console.log(jsonRespuesta);
console.log("Frase: " +jsonRespuesta.sentence + " ,Categoria: " + jsonRespuesta.category);
Returns:
{"sentence":"hola","category":"2"}
Frase: undefined ,Categoria: undefined
What's failing? If it helps, capturing the packets with wireshark displays the array members as strings
Is your java client encoding the JSON twice? I noticed you are adding json strings to an ArrayList, but you should really be adding objects to the ArrayList and then stringifying the whole thing once.
Try using JSON.parse() again on jsonRepuesta and see if that gets you what you're looking for. Alternatively, log out a typeof jsonRepuesta -- looks like it's still a string.
Also, see here.
I am having an Java Object which consist many type of variables including a JSONObject.
Whan i debug my object i got the following String for JSONObject:-
{"INCLUSIONS":{"OPTIONS":[{"display":"Complimentary stay for children under 5 without extra bed"}]}}
But when i used:-gson.toJson(JSONObj),I got following
{"myHashMap":{"INCLUSIONS":{"myHashMap":{"OPTIONS":{"myArrayList":[{"myHashMap":{"display":"Complimentary stay for children under 5 without extra bed"}}]}}}}}
Someone please can elaborate why it is converting JSONObject to Map & list ??
Or Any work Around ??
Thanks.
Just use myJsonObj.toString() instead of myJsonObj.toJSON()
Your problem happens because a JSONObject is stored as a HashMap to allow the programmer to reach values with methods based on keys. As example,
String jsonStr = "{'key': 'value'}";
JsonObject json = gson.fromJson(jsonStr, JsonObject.class);
String value = json.get("key").getAsString();
You can figure that json attributes are stored as a HashMap<JsonElement>
JSON:
{"attribute1":11, "attribute2":"string atribute"}
I want to detect what kind of type are attribute1 and attribute2:
attribute1 is integer
attribute2 is string
jsonObject.getAttributeType("attribute2"); // should output: string/integer/boolean.
It was very easy to achieve in PHP or OBJC. Suggestions?
(I'm assuming that the Android for the org.json package is that same as you can find on the json.org site ... here.)
The only method on a JSONObject that will give you the underlying value ... without coercing it ... is JSONObject.get(name). If name is known, the result is the object that represents the value internally. I haven't done a comprehensive trawl of the code, but I think it can only be one of the following types:
Boolean, Long, Double, String, JSONArray, JSONObject
You should be able to discriminate these using instanceof.
But should be asking yourself if this is the right thing to do. The normal way to deal with JSON object attributes via the JSONObject API is to use the methods that coerce them into the type that you expect. In most cases, it doesn't matter if a number is sent as 42 or 42.0 or "42" ... and it is best not to be picky if the intent is easy to determine.
Another solution you can use the jackson library to do this,
import com.fasterxml.jackson.databind.JsonNode;
import com.github.fge.jackson.JsonLoader;
//Defining the JSON object
JSON json = {"attribute1":11, "attribute2":"string atribute"};
//Get the needed attribute
String value = json.get("attribute1");
//Convert the attribute to JsonNode
JsonNode value = JsonLoader.fromString(value);
//Then you can check type as below
value.isObject();
value.isArray();
value.isDouble();
value.isTextual();
value.isInt()