Convert returned JSON String to a JSONArray - java

I have a web service that performs a database query, converts the result set to a JSON String and returns the strung to the client. This is the code for the converter (I got it from http://biercoff.com/nice-and-simple-converter-of-java-resultset-into-jsonarray-or-xml/):
public static String convertToJSON(ResultSet resultSet)
throws Exception {
JSONArray jsonArray = new JSONArray();
while (resultSet.next()) {
int total_rows = resultSet.getMetaData().getColumnCount();
JSONObject obj = new JSONObject();
for (int i = 0; i < total_rows; i++) {
obj.put(resultSet.getMetaData().getColumnLabel(i + 1)
.toLowerCase(), resultSet.getObject(i + 1));
}
jsonArray.add(obj);
}
return jsonArray.toJSONString();
}
In the client application when I print the returned string it is in the following format:
[{"Column1":0.333333,"Column2":"FirmA"},{"Column1":0.666667,"Column2":"FirmB"}]
so far all is good. The problem I am having is converting the returned string into a JSON array. I tried this:
JSONArray arr = new JSONArray(JSON_STRING);
but got the following error message: constructor JSONArray in class JSONArray cannot be applied to given types. I tried to first convert in into a JSON object like so:
JSONObject obj = new JSONObject(JSON_STRING);
but got the following error: incompatible types: String cannot be converted to Map. What am I doing wrong? Thanks.

Apparently the problem was with the json library that I was using. Once I used the
import org.json.JSONArray;
it all worked out well. I was able to convert the returned string to an array using
JSONArray arr = new JSONArray(JSON_STRING);
and to iterate through the values I used the code provided in this answer: Accessing members of items in a JSONArray with Java which I reproduce here for simplicity:
for (int i = 0; i < arr.length(); ++i) {
JSONObject rec = arr.getJSONObject(i);
int id = rec.getInt("id");
String loc = rec.getString("loc");
// ...
}

well you need to do it by this way for example
String jsonText = "[0,{\"1\":{\"2\":{\"3\":{\"4\":[5,{\"6\":7}]}}}}]";
try {
JSONArray array = new JSONArray(jsonText);
System.out.println(array);
System.out.println(array.length());
} catch (Exception e) {
// TODO: handle exception
e.printStackTrace();
}
}

Check the correct library used. The mess is that org.json.simple is often suggested by IDE as default for JSONObject and JSONArray.
You can find a link to latest jar for org.json library above.

Related

How to get values from JSONObject in Java?

I am trying to parse a JsonArray and get its values but I am gettign error when I use
jitem.getString("firstitem");
or
jitem.getJSONObject("firstitem");
or
jitem.get("firstitem");
Following is the code snippet.
JSONArray arr_items = new JSONArray(str);
if(arr_items!=null && arr_items.size()>0){
for(int i=0;i<arr_items.size();i++){
JSONObject jitem = arr_items.getJSONObject(i);//works fine till here
jitem.getString("firstitem"); //throws exception here
}
This is the JSONArray that I am parsing
[{"firstitem":"dgfd","secondtitem":"dfgfdgfdg","thirditem":"fdgfdgdf#sjhasjkdsha.com","fourthitem":"jkksdjklsfjskj"}]
what I am doing wrong? How to get these values by using keys?
Update:Note This array and its parameters are not null at all. They all have valid values.
First check arr_items is not empty.
Then, try surrounding your snippet with try/catch :
try {
your snippet
} catch (JSONException e) {
e.printStackTrace();
}
Check below
String json ="{'array':" + "[{'firstitem':'dgfd','secondtitem':'dfgfdgfdg','thirditem':'fdgfdgdf#sjhasjkdsha.com','fourthitem':'jkksdjklsfjskj'}]"+ "}";
JSONObject myjson = new JSONObject(json);
JSONArray the_json_array = myjson.getJSONArray("array");
int size = the_json_array.length();
// ArrayList<JSONObject> arrays = new ArrayList<JSONObject>();
for (int i = 0; i < size; i++) {
JSONObject another_json_object = the_json_array.getJSONObject(i);
// arrays.add(another_json_object);
System.out.println(another_json_object.get("firstitem"));
}
it require some array name so appended array name to it , if you want without it you have to add GSON.

Java - looping through JSONArray

i am trying to call an URL and afterwards to save the results of the URL into a database.
The call of the URL is working and i also am able to save the result into JSON objects/arrays.
This is my code so far:
JSONParser parser = new JSONParser();
try
{
// responseString is the answer i get from calling the URL.
// It's pretty long that's why i don't copy it in here now
// But you can call this URL to see what the result is:
// http://www.gw2spidy.com/api/v0.9/json/items/all/1?filter_ids=29169,29185
Object objToParse = parser.parse(responseString);
JSONObject jsonObject = (JSONObject) objToParse;
JSONArray array = (JSONArray) jsonObject.get("results");
// Until here everything is ok, the results get saved into the array
JSONObject mJsonObject = new JSONObject();
for (int i = 0; i < array.length() ; i++)
{
mJsonObject = (JSONObject)array.get(i);
System.out.println(mJsonObject);
}
}
catch(ParseException pe)
{
System.out.println("position: " + pe.getPosition());
System.out.println(pe);
}
When i try to run this i get an error when i try to loop through the array:
Exception in thread "main" java.lang.ClassCastException: org.json.simple.JSONArray cannot be cast to java.lang.CharSequence
I already searched for solutions but i cannot find or understand what is causing the error for me, would be nice if someone can help me here..
Ok at the end this was working for me:
JSONObject jsonObject = new JSONObject(responseString);
JSONArray array = (JSONArray) jsonObject.get("results");
JSONObject mJsonObject = new JSONObject();
for (int i = 0; i < array.length() ; i++)
{
mJsonObject = (JSONObject)array.get(i);
System.out.println(mJsonObject);
}
Had to change org.json.simple to instead use org.json and changed some lines then it was working.
I rather think that your implementation using simple json was wrong.
Although you didn't mention exactly, the only place your Exception could happen would be the line
JSONArray array = (JSONArray) jsonObject.get("results");
and as this is the same in both implementations, something previous to that must have happened leading to a situation with simple json where the results property is not a JSONArray. Probably something with parser.parse(...).

How to read JSON in Java?

I have a JSON String and I got the data element's data to JSONObject. After I read this that resultant string is as follows. I'm using org.json library.
String dataStr = "[{\"name\":\"jhonny\",\"counts\":[\"50\",\"44\",\"46\"],\"url\":\"google\"},
{\"name\":\"john\",\"counts\":[\"344\",\"4\",\"18\"],\"url\":\"yahoo\"}]";
I tried to read the each element like following,
String dataStr = report.get("data").toString();
JSONObject data = new JSONObject(dataStr.substring(1));
System.out.println(data);
But my output is,
{"name":"jhonny","counts":["50","44","46"],"url":"google"}
The output contains only one element. How can I fix this?
JSONArray jsonarray = new JSONArray(datastr);
for(int i=0; i<jsonarray.length(); i++){
JSONObject data= jsonarray.getJSONObject(i);
System.out.println(data);
}
Using the org.json library:
JSONObject obj = new JSONObject("{interests : [{interestKey:Dogs}, {interestKey:Cats}]}");
List<String> list = new ArrayList<String>();
JSONArray array = obj.getJSONArray("interests");
for(int i = 0 ; i < array.length() ; i++){
list.add(array.getJSONObject(i).getString("interestKey"));
}
The problem is you are trying to read JSONArray as JSONObject.
To parse JSONArray you need to do something like: (Not sure which library you are using)
for (int i = 0; i < jsonarray.length(); i++) {
JSONObject jsonobject = jsonarray.getJSONObject(i);
// jsonobject holds the desired element.
}
If you analyze your json string, you will notice that your json string contains multiple json object without outer object like :-
{
"outer":{
{\"name\":\"jhonny\",\"counts\":[\"50\",\"44\",\"46\"],\"url\":\"google\"},
{\"name\":\"jhonny\",\"counts\":[\"50\",\"44\",\"46\"],\"url\":\"google\"}
}
}
The way you are parsing require this kind of json structure. Your json string is actually just a jsonarray. So do like this way :
JSONArray jsonarray = new JSONArray(datastr);
for(int i=0; i<jsonarray.length(); i++){
JSONObject data= jsonarray.getJSONObject(i);
}
For more you can visit this link that gives you good explanation to how to read json in java

how to read JSON from HTTP GET request?

I have created a java server which gets HTTP GET request url as
/Star/getDetails?sentMsg=data.requestorName:ABC,data.companyName:EFG,portfolios:
[{name:,placeholder:Portfolio 1,positions:[{ticker:T1234,weight:29.85},
{ticker:T2345,weight:70.15}],active:false}],analyticsDate:20140630}
I have to parse sentMsg parameter such as I am able to read each variable individually. For eg, i should be able to read data.requestorName, companyName. I am not able to find a way to do it.
request.getParameter("sentMsg") always return String.
Tried parsing it through json-simple
JSONParser jp = new JSONParser();
try {
Object obj = jp.parse(sentMsg);
JSONArray ja = (JSONArray)obj;
} catch (ParseException e) {
e.printStackTrace();
}
But this gives parse exception. I have limitation to use json-simple jar only. Any suggestion on how to do it?
Get the paramter sentMsg from HttpRequest object store it into a string. Split from comma i.e. "," and the last second token would be the json string. You can now parse it using Json simple lib and extract values from it.
Provided you have valid JSON like:
private static String jsonString = "[{name : \"stackOverFlow\"}]";
Convert it to JSONArray like:
JSONArray jsonArray = new JSONArray(jsonString );
Then you can get value out of JSONArray by looping through it:
for (int i = 0; i < jsonArray.length(); i++) { //Iterating over mediaArray
JSONObject media = jsonArray.getJSONObject(i);
String nameFromJSON = media.getString("name");
System.out.println("Name = " + nameFromJSON);
}
Output will be:
//Name = stackOverFlow

Reading JSON on Android, No Output

This is my JSON data.
{"JSONDATA":[{"key":0,"value":"--Any--"},{"key":61,"value":"Accounting"},{"key":81,"value":"Aerospace & Defense"},{"key":72,"value":"Automotive"},{"key":83,"value":"Banking"},{"key":84,"value":"Biotech"},{"key":85,"value":"Construction"},{"key":86,"value":"Customer Service"},{"key":87,"value":"Education"},{"key":82,"value":"Energy"},{"key":70,"value":"Finance"},{"key":193,"value":"Government"},{"key":194,"value":"Healthcare"},{"key":71,"value":"Insurance"},{"key":73,"value":"Legal"},{"key":62,"value":"Management"},{"key":63,"value":"Manufacturing"},{"key":64,"value":"Marketing\/Advertising"},{"key":77,"value":"Media - Journalism"},{"key":74,"value":"Pharmaceutical"},{"key":75,"value":"Real Estate"},{"key":76,"value":"Research"},{"key":65,"value":"Restaurant"},{"key":66,"value":"Retail"},{"key":67,"value":"Sales"},{"key":78,"value":"Science"},{"key":68,"value":"Telecommunications"},{"key":79,"value":"Training"},{"key":69,"value":"Transportation"},{"key":80,"value":"Utilities"}]}
I want to decode it on my Android App, This is the code i have used., But i don't get anything on my output. No errors too.
JSONObject jObject= new JSONObject();
JSONArray menuObject = new JSONArray(jObject.getString("JSONDATA"));
String app;
for (int i = 0; i<menuObject.length(); i++) {
{
app=menuObject.getJSONObject(i).getString("value").toString();
a.append(app); // a is my TextView
}
First off, you're not initializing your jObject with anything.
//pass in string
JSONObject jObject= new JSONObject(jsonString);
JSONObjects need something to parse, otherwise (the way you have it now) they initialize with no data, which isn't very helpful.
Secondly, you're using getString when you really want an array:
JSONArray menuObject = jObject.getJSONArray("JSONDATA");
getString is designed to return a piece of string data from a JSON object. "JSONDATA" holds an array, so we need to choose the correct type to retrieve.
Thirdly, you have a redundant toString(), as getString already returns a String:
app=menuObject.getJSONObject(i).getString("value");
Its wrong:
JSONArray menuObject = new JSONArray(jObject.getString("JSONDATA"));
Try:
JSONObject jObject= new JSONObject(yourJSONString);
JSONArray menuObject = jObject.getJSONArray("JSONDATA");
Keep one thing in mind:
Create a JSON Object with JSON String you want to parse and then you can fetch String/JSON Object or JSON Array from the created JSON Object.
Store your json response in a String
String jsonResponse="YOUR JSON RESPONSE STRING";
//Pass the string as below
JSONObject jObject= new JSONObject(jsonResponse);
JSONArray menuObject = jObject.getJSONArray("JSONDATA"));
String app;
for (int i = 0; i<menuObject.length(); i++) {
{
app=menuObject.getJSONObject(i).getString("value").toString();
a.append(app); // a is my TextView
}
Use the appropiate getters and setters in JSONObject and JSONArray, and your "JSONDATA" entry is not a string. Do something like this:
JSONObject jObject = new JSONObject(yourJsonString);
JSONArray menuArray = jObject.getJSONArray("JSONDATA");
for (int i = 0; i < menuArray.length(); i++) {
String app = menuObject.getJSONObject(i).getString("value");
a.append(app); // a is my TextView
}
Use following code for parse your json string.
JSONObject obj = new JSONObject(youtString);
JSONArray array = obj.getJSONArray("JSONDATA");
for (int i = 0; i < array.length(); i++) {
JSONObject c = array.getJSONObject(i);
String key = c.getString("key");
String value = c.getString("value");
a.append(value);
}
Use this:-
String result="[{"key":0,"value":"--Any--"},{"key":61,"value":"Accounting"},{"key":81,"value":"Aerospace & Defense"},{"key":72,"value":"Automotive"},{"key":83,"value":"Banking"},{"key":84,"value":"Biotech"},{"key":85,"value":"Construction"},{"key":86,"value":"Customer Service"},{"key":87,"value":"Education"},{"key":82,"value":"Energy"},{"key":70,"value":"Finance"},{"key":193,"value":"Government"},{"key":194,"value":"Healthcare"},{"key":71,"value":"Insurance"},{"key":73,"value":"Legal"},{"key":62,"value":"Management"},{"key":63,"value":"Manufacturing"},{"key":64,"value":"Marketing\/Advertising"},{"key":77,"value":"Media - Journalism"},{"key":74,"value":"Pharmaceutical"},{"key":75,"value":"Real Estate"},{"key":76,"value":"Research"},{"key":65,"value":"Restaurant"},{"key":66,"value":"Retail"},{"key":67,"value":"Sales"},{"key":78,"value":"Science"},{"key":68,"value":"Telecommunications"},{"key":79,"value":"Training"},{"key":69,"value":"Transportation"},{"key":80,"value":"Utilities"}]";
JSONArray menuObject = new JSONArray(result);
String app;
for (int i = 0; i<menuObject.length(); i++) {
{
app=menuObject.getJSONObject(i).getString("value").toString();
a.append(app); // a is my TextView
}

Categories