Is it possible to convert from the newer EJB JSON libraries to the older org.json ones without having to rely on org.json.simple or GSON?
In the case below, "buttons" is a populated JsonArray and I'm trying to copy it into a JSONArray for legacy code. But the initialization of JSONArray from a stringified value always fails with "A JSONObject text must begin with '{'" because a quote is seen as a first character rather than a curly brace.
JSONArray newButtons = new JSONArray();
for (int i = 0; i < buttons.size(); i++) {
JsonString button = buttons.getJsonString(i);
newButtons.put(new JSONArray(button.toString()));
}
return new JSONArray(newButtons);
It doesn't seem like there is any kind of org.json object that I can initialize from a string constructor with a toString() value from the javax.json library. I have managed to move data from org.json structures to javax.json ones, but not vice versa. Is the org.json library too inflexible to do this?
I haven't tried it, but I believe following should work.
JSONArray newButtons = new JSONArray();
for (int i = 0; i < buttons.size(); i++) {
JsonObject button = buttons.getJsonObject(i);
newButtons.put(new org.json.JSONObject(button.toString()));
}
return newButtons;
With the following line you get first the object with index 'i' and then make a JSON String out of it. Your original code rather returns the element 'i' as a value instead of an object.
JsonString button = buttons.getJsonObject(i).toString();
Related
Hi Below is a simple method which I am using to dynamically generate the JSON request based on Array length from some other API response.
However inside the for loop everything seems to work fine except at the end when JSONArray.add is called, it replaces old jsonObject values inside the array to a new one, and at the end whole array consists of the only same set of JSON objects.
After a lot of debugging can't find the solution, is due to a variable declaration or something. Below is the method I am using
For ref: I am using minidev.JSON
public JSONObject method1(JSONObject sampleJsonObjTemplate, String responseofotherapi) {
JSONArray jsonArray = JsonPath.parse(responseofotherapi).read("$.columns");
JSONArray dataSetColumnArray = new JSONArray();
JSONArray currentJsonColumnArr= JsonPath.parse(dataSetObj).read("$.columns");
JSONObject currentJsonColumnObject= (JSONObject) currentJsonColumnArr.get(0);
LinkedHashMap<String,Object> currentColumn;
for(int columnNumber = 0; columnNumber < jsonArray.size(); columnNumber++){
currentColumn= (LinkedHashMap<String,Object>)jsonArray.get(columnNumber);
String name = currentColumn.get("name").toString();
currentJsonColumnObject.put("name",name);
currentJsonColumnObject.put("alias",name+" Column Alias ");
currentJsonColumnObject.put("description",name+" Column Description ");
dataSetColumnArray.add(columnNumber,currentJsonColumnObject);
currentColumn.clear();
}
JSONObject updatedDataSetReq=JsonPath.parse(dataSetObj).set("$.columns",dataSetColumnArray).json();
return updatedDataSetReq;
}
The problem is with your currentJsonColumnObject object assigning in for loop.
you are using the same object currentJsonColumnObject for all iterations which is referring to currentJsonColumnArr.get(0).
To solve your issue you need to set a different object for currentJsonColumnObject.
JSONArray jsonArray = JsonPath.parse(responseofotherapi).read("$.columns");
JSONArray dataSetColumnArray = new JSONArray();
JSONArray currentJsonColumnArr= JsonPath.parse(dataSetObj).read("$.columns");
//object will be set inside loop
JSONObject currentJsonColumnObject;
LinkedHashMap<String,Object> currentColumn;
for(int columnNumber = 0; columnNumber < jsonArray.size(); columnNumber++){
currentColumn= (LinkedHashMap<String,Object>)jsonArray.get(columnNumber);
// getting object from `currentJsonColumnArr` instead of using the same.
currentJsonColumnObject= (JSONObject) currentJsonColumnArr.get(columnNumber);
String name = currentColumn.get("name").toString();
currentJsonColumnObject.put("name",name);
currentJsonColumnObject.put("alias",name+" Column Alias ");
currentJsonColumnObject.put("description",name+" Column Description ");
dataSetColumnArray.add(columnNumber,currentJsonColumnObject);
currentColumn.clear();
}
I have a JSON object that looks like this
{"layout":[["12","21","31"],["empty","22","32"],["13","23","33"]]}
I am trying to get the array data within with:
JSONObject layoutJson;
JSONArray layoutData = layoutJson.getJSONArray();
However I end up with a single entry in the array of
[["12","21","31"],["empty","22","32"],["13","23","33"]]
How do I get this out of the JSON object in the form of 3 arrays?
JSONObject layoutJson;
JSONArray layoutData = layoutJson.getJSONArray();
for (int i = 0; i < layoutData.length(); i++) {
JSONObject firstArray = (JSONObject)layoutData.getJSONObject(i);
// Do whatever you want with first array
// you can loop through the first array again
}
I am working on a project where I have to clear all the data from a JSON array. There seems to be no method like jsonArray.clear(). Also tried jsonArray = new JSONArray(). That too didn't worked. Suggestions please
Just create a new JSONArray.
JSONArray otherJsonArray = new JSONArray();
Or iterate through the array and remove(int index) the indexes.
http://www.json.org/javadoc/org/json/JSONArray.html#remove(int)
Just put jsonArray = new JSONArray()
Creating a new one will work, unless you have passed it as a parameter to a method in which case you need to modify the referenced object as a new reference will not be seen by the calling method.
So if that is the case, do it backwards, that way you won't get your iterator exceeding bounds:
int startingLength = someJsonArray.length();
for (int i = startingLength - 1; i >= 0; i--) {
someJsonArray.remove(i);
}
And you use that
otherJsonArray is already existing then you use
JSONArray otherJsonArray = new JSONArray("[]");
We can use someJsonArray.pop(index) to remove require record.
We can use this code in loop to remove all records.
I have a situation where I want to remove all the entries from a JSONArray with key "Constants", which is an element in a JSONObject, creating a new JSONArray an assigning it does NOT clear the JSONArray, I have to iterate through the JSONArray and jsonArray.remove(i) on each of them, but there is a second method that works which involves removing the array element, in this case "Constants" completely from the JSONObject and re-adding it as a new JSONArray.
Hereis code with assignment of new array, which does not work, the JSONArray remained unchanged: (I tried both above suggestions for new JSONArray(); and new JSONArray("[]");
JSONObject jsonObj = new JSONObject(metadataOriginalJSON);
if (jsonObj.isJSONArray("Constants")) {
JSONArray constantsArray = jsonObj.getJSONArray("Constants");
constantsArray = new JSONArray();
metadataConstantsRemoved = jsonObj.toString();
}
Here is code for the iteration through the JSONArray which worked:
JSONObject jsonObj = new JSONObject(metadataOriginalJSON);
if (jsonObj.isJSONArray("Constants")) {
JSONArray constantsArray = jsonObj.getJSONArray("Constants");
int i = 0;
int arrayLenSanityCheckPreventEndlessLoop = constantsArray.length();
while (constantsArray.length() > 0 && i < arrayLenSanityCheckPreventEndlessLoop) {
constantsArray.remove(0);
i++;
}
metadataConstantsRemoved = jsonObj.toString();
}
The 2nd method that works by removing the entire JSONArray element and re-adding it to the JSONObject:
JSONObject jsonObj = new JSONObject(metadataOriginalJSON);
if (jsonObj.isJSONArray("Constants")) {
jsonObj.remove("Constants");
jsonObj.put("Constants", new JSONArray());
metadataConstantsRemoved = jsonObj.toString();
}
i have this JSON object:
{"error":null,
"result":[{"id":"1234567890",
"count":1,
"recipients":
["u3848",
"u8958",
"u7477474"
],
"dateCreated":"2012-06-13T09:13:45.989Z"
}]
}
and I'm trying to find a way to correctly parse the recipients array into a String[] object.
is there an easy way to do this?
EDIT:
found this answer that has all the things needed for result: Sending and Parsing JSON Objects
the way to do what I wanted was this:
JSONArray temp = jsonObject.getJSONArray("name");
int length = temp.length();
if (length > 0) {
String [] recipients = new String [length];
for (int i = 0; i < length; i++) {
recipients[i] = temp.getString(i);
}
}
You can try to use xstream with json serializer. Take a look this link
I always suggest my favorite library json-lib to handle JSON stuffs.
You can use JSONArray to convert to Object[], although it's not String[], you can still use it because every Object has toString() method.
String sYourJsonString = "['u3848', 'u8958', 'u7477474']";
Object[] arrayReceipients = JSONArray.toArray (JSONArray.fromObject(sYourJsonString));
System.out.println (arrayReceipients [0]); // u3848
I am building an android app that needs to download and synchronise with an online database, I am sending my query from the app to a php page which returns the relevant rows from a database in JSON format.
can someone please tell me the best way to iterate through a JSON array?
I receive an array of objects:
[{json object},{json object},{json object}]
What is the simplest piece of code I could use to access the JSONObjects in the array?
EDIT: now that I think of it the method I used to iterate the loop was:
for (String row: json){
id = row.getInt("id");
name = row.getString("name");
password = row.getString("password");
}
So I guess I had was somehow able to turn the returned Json into and iterable array. Any Ideas how I could achieve this?
I apologise for my vaguness but I had this working from an example I found on the web and have since been unable to find it.
I think this code is short and clear:
int id;
String name;
JSONArray array = new JSONArray(string_of_json_array);
for (int i = 0; i < array.length(); i++) {
JSONObject row = array.getJSONObject(i);
id = row.getInt("id");
name = row.getString("name");
}
Is that what you were looking for?
I have done it two different ways,
1.) make a Map
HashMap<String, String> applicationSettings = new HashMap<String,String>();
for(int i=0; i<settings.length(); i++){
String value = settings.getJSONObject(i).getString("value");
String name = settings.getJSONObject(i).getString("name");
applicationSettings.put(name, value);
}
2.) make a JSONArray of names
JSONArray names = json.names();
JSONArray values = json.toJSONArray(names);
for(int i=0; i<values.length(); i++){
if (names.getString(i).equals("description")){
setDescription(values.getString(i));
}
else if (names.getString(i).equals("expiryDate")){
String dateString = values.getString(i);
setExpiryDate(stringToDateHelper(dateString));
}
else if (names.getString(i).equals("id")){
setId(values.getLong(i));
}
else if (names.getString(i).equals("offerCode")){
setOfferCode(values.getString(i));
}
else if (names.getString(i).equals("startDate")){
String dateString = values.getString(i);
setStartDate(stringToDateHelper(dateString));
}
else if (names.getString(i).equals("title")){
setTitle(values.getString(i));
}
}
Unfortunately , JSONArray doesn't support foreach statements, like:
for(JSONObject someObj : someJsonArray) {
// do something about someObj
....
....
}
When I tried #vipw's suggestion, I was faced with this exception:
The method getJSONObject(int) is undefined for the type JSONArray
This worked for me instead:
int myJsonArraySize = myJsonArray.size();
for (int i = 0; i < myJsonArraySize; i++) {
JSONObject myJsonObject = (JSONObject) myJsonArray.get(i);
// Do whatever you have to do to myJsonObject...
}
If you're using the JSON.org Java implementation, which is open source, you can just make JSONArray implement the Iterable interface and add the following method to the class:
#Override
public Iterator iterator() {
return this.myArrayList.iterator();
}
This will make all instances of JSONArray iterable, meaning that the for (Object foo : bar) syntax will now work with it (note that foo has to be an Object, because JSONArrays do not have a declared type). All this works because the JSONArray class is backed by a simple ArrayList, which is already iterable. I imagine that other open source implementations would be just as easy to change.
On Arrays, look for:
JSONArray menuitemArray = popupObject.getJSONArray("menuitem");
You are using the same Cast object for every entry.
On each iteration you just changed the same object instead creating a new one.
This code should fix it:
JSONArray jCastArr = jObj.getJSONArray("abridged_cast");
ArrayList<Cast> castList= new ArrayList<Cast>();
for (int i=0; i < jCastArr.length(); i++) {
Cast person = new Cast(); // create a new object here
JSONObject jpersonObj = jCastArr.getJSONObject(i);
person.castId = (String) jpersonObj.getString("id");
person.castFullName = (String) jpersonObj.getString("name");
castList.add(person);
}
details.castList = castList;
While iterating over a JSON array (org.json.JSONArray, built into Android), watch out for null objects; for example, you may get "null" instead of a null string.
A check may look like:
s[i] = array.isNull(i) ? null : array.getString(i);