Something like this:
JSONObject songs= json.getJSONObject("songs");
Iterator x = songs.keys();
JSONArray jsonArray = new JSONArray();
while (x.hasNext()){
String key = (String) x.next();
jsonArray.put(songs.get(key));
}
Answer from nikis on Stack OverflowSomething like this:
JSONObject songs= json.getJSONObject("songs");
Iterator x = songs.keys();
JSONArray jsonArray = new JSONArray();
while (x.hasNext()){
String key = (String) x.next();
jsonArray.put(songs.get(key));
}
Even shorter and with json-functions:
JSONObject songsObject = json.getJSONObject("songs");
JSONArray songsArray = songsObject.toJSONArray(songsObject.names());
How to turn json objects into an array of json objects using Java?
java - How to parse a JSON and turn its values into an Array? - Stack Overflow
json - How to convert automatically list of objects to JSONArray with Gson library in java? - Stack Overflow
java - Method to cast Object to JSONObject or JSONArray depending on the Object - Stack Overflow
Videos
Hi. I'm new to java and stuck wondering how I would go about turning something like this: {} {} {} into this: [{},{},{}]. I'm trying to figure out how to do this to my incoming json data using Java. The data has like 20 similar objects, with the same keys but with constantly changing values.
Any help is much appreciated.
Sincerely,
your friendly neighborhood noob
for your example:
{'profiles': [{'name':'john', 'age': 44}, {'name':'Alex','age':11}]}
you will have to do something of this effect:
JSONObject myjson = new JSONObject(the_json);
JSONArray the_json_array = myjson.getJSONArray("profiles");
this returns the array object.
Then iterating will be as follows:
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);
//Blah blah blah...
arrays.add(another_json_object);
}
//Finally
JSONObject[] jsons = new JSONObject[arrays.size()];
arrays.toArray(jsons);
//The end...
You will have to determine if the data is an array (simply checking that charAt(0) starts with [ character).
Hope this helps.
You can prefer quick-json parser to meet your requirement...
quick-json parser is very straight forward, flexible, very fast and customizable. Try this out
[quick-json parser] (https://code.google.com/p/quick-json/) - quick-json features -
Compliant with JSON specification (RFC4627)
High-Performance JSON parser
Supports Flexible/Configurable parsing approach
Configurable validation of key/value pairs of any JSON Heirarchy
Easy to use # Very Less foot print
Raises developer friendly and easy to trace exceptions
Pluggable Custom Validation support - Keys/Values can be validated by configuring custom validators as and when encountered
Validating and Non-Validating parser support
Support for two types of configuration (JSON/XML) for using quick-json validating parser
Require JDK 1.5 # No dependency on external libraries
Support for Json Generation through object serialization
Support for collection type selection during parsing process
For e.g.
JsonParserFactory factory=JsonParserFactory.getInstance();
JSONParser parser=factory.newJsonParser();
Map jsonMap=parser.parseJson(jsonString);
This way is worked for me:
Convert all list to String.
String element = gson.toJson(
groupsList,
new TypeToken<ArrayList<GroupItem>>() {}.getType());
Create JSONArray from String:
JSONArray list = new JSONArray(element);
The org.json based classes included in Android don't have any features related to converting Java POJOs to/from JSON.
If you have a list of some class (List<GroupItem>) and you absolutely need to convert that to a org.json.JSONArray you have two choices:
A) Use Gson or Jackson to convert to JSON, then parse that JSON into a JSONArray:
List<GroupItem> list = ...
String json = new Gson().toJson(list);
JSONArray array = new JSONArray(json);
B) Write code to create the JSONArray and the JSONObjects it will contain from your Java objects:
JSONArray array = new JSONArray();
for (GroupItem gi : list)
{
JSONObject obj = new JSONObject();
obj.put("fieldName", gi.fieldName);
obj.put("fieldName2", gi.fieldName2);
array.put(obj);
}
I assume you've seen this question.
You can probably just add a check of the type using instanceof before you return from each method, and return null if the Object is not of the type expected. That should get rid of the ClassCastException.
Example:
public static JSONObject objectToJSONObject(Object object){
Object json = null;
JSONObject jsonObject = null;
try {
json = new JSONTokener(object.toString()).nextValue();
} catch (JSONException e) {
e.printStackTrace();
}
if (json instanceof JSONObject) {
jsonObject = (JSONObject) json;
}
return jsonObject;
}
public static JSONArray objectToJSONArray(Object object){
Object json = null;
JSONArray jsonArray = null;
try {
json = new JSONTokener(object.toString()).nextValue();
} catch (JSONException e) {
e.printStackTrace();
}
if (json instanceof JSONArray) {
jsonArray = (JSONArray) json;
}
return jsonArray;
}
Then, you can try both methods, and use the return value of the one that doesn't return null, something like this:
public void processJSON(Object obj){
JSONObject jsonObj = null;
JSONArray jsonArr = null;
jsonObj = objectToJSONObject(obj);
jsonArr = objectToJSONArray(obj);
if (jsonObj != null) {
//process JSONObject
} else if (jsonArr != null) {
//process JSONArray
}
}
JsonArray is inherently a List
JsonObject is inherently a Map
Since Java doesn't support functions having multiple return types(unless it is a generic function with return type accepted as argument - example), the most simple way to perform what you need is the following:
if (object instanceof Map){
JSONObject jsonObject = new JSONObject();
jsonObject.putAll((Map)object);
...
...
}
else if (object instanceof List){
JSONArray jsonArray = new JSONArray();
jsonArray.addAll((List)object);
...
...
}
An alternative to this, if you want it as a function, is to convert the given JsonObject into a JsonArray and write your code to operate on that JsonArray, without having to worry about the type. The following function serves the said purpose.
public JSONArray getJsonObjectOrJsonArray(Object object){
JSONArray jsonArray = new JSONArray();
if (object instanceof Map){
JSONObject jsonObject = new JSONObject();
jsonObject.putAll((Map)object);
jsonArray.add(jsonObject);
}
else if (object instanceof List){
jsonArray.addAll((List)object);
}
return jsonArray;
}
Here is some code using java 6 to get you started:
JSONObject jo = new JSONObject();
jo.put("firstName", "John");
jo.put("lastName", "Doe");
JSONArray ja = new JSONArray();
ja.put(jo);
JSONObject mainObj = new JSONObject();
mainObj.put("employees", ja);
Edit: Since there has been a lot of confusion about put vs add here I will attempt to explain the difference. In java 6 org.json.JSONArray contains the put method and in java 7 javax.json contains the add method.
An example of this using the builder pattern in java 7 looks something like this:
JsonObject jo = Json.createObjectBuilder()
.add("employees", Json.createArrayBuilder()
.add(Json.createObjectBuilder()
.add("firstName", "John")
.add("lastName", "Doe")))
.build();
I suppose you're getting this JSON from a server or a file, and you want to create a JSONArray object out of it.
String strJSON = ""; // your string goes here
JSONArray jArray = (JSONArray) new JSONTokener(strJSON).nextValue();
// once you get the array, you may check items like
JSONOBject jObject = jArray.getJSONObject(0);
Hope this helps :)