I am trying to fill a ListView inside an Async Task!
all_items = gson.toJson(profile);
this is the rest
try {
JSONObject object = new JSONObject(all_items);
JSONArray ja = object.getJSONObject("tree").getJSONArray("children");
for (int i = 0; i < ja.length(); i++) {
JSONObject object1 = ja.getJSONObject(i);
if (object1.has("name") && object1.has("percentage")) {
System.out.println(object1.has("name"));//nothing gets printed
HashMap<String, Object> tmp = new HashMap<>();
tmp.put("name", object1.get("name"));
tmp.put("percentage", object1.get("percentage"));
array_list.add(tmp);
}
}
}catch(JSONException e){
e.printStackTrace();
}
Json Array is in this format:
This new code is not outputing nothing,no lists is shown The Json is in this format
{
"id": "*UNKNOWN*",
"processed_lang": "en",
"source": "*UNKNOWN*",
"tree": {
"children": [
{
"children": [
{
"category": "personality",
"children": [
{
"category": "personality",
"children": [
{
"category": "personality",
"id": "Adventurousness",
"name": "Adventurousness",
"percentage": 0.6317251869427992,
"sampling_error": 0.0550028572
No Error is thrown however the list is still empty.
there are basically 3 more children array inside the children array. Your code just gets the top level children and tries to find the attributes inside it
try {
JSONObject object = new JSONObject(all_items);
JSONArray ja = object.getJSONObject("tree").getJSONArray("children");
for (int k = 0; k < ja.size(); k++) {
JSONObject lvlOne = ja.getJSONObject(k);
JSONArray lvlOneArray = lvlOne.getJSONArray("children");
for (int j = 0; j < lvlOneArray.size(); j++) {
JSONObject lvlTwo = lvlOneArray.getJSONObject(i);
JSONArray lvlTwoArray = lvlTwo.getJSONArray("children");
for (int i = 0; i < lvlTwoArray.length(); i++) {
JSONObject object1 = lvlTwoArray.getJSONObject(i);
if (object1.has("name") && object1.has("percentage")) {
System.out.println(object1.has("name"));//nothing gets printed
HashMap<String, Object> tmp = new HashMap<>();
tmp.put("name", object1.get("name"));
tmp.put("percentage", object1.get("percentage"));
array_list.add(tmp);
}
}
}catch(JSONException e){
e.printStackTrace();
}
Related
I have problem when I try to get data from a JSON array in Android Studio.
I want to get data from year 2015, 2016 and 2018 populate them in different textviews.
This is my JSON:
"data": [
{
"id": "7",
"kecamatan": "Blambangan Umpu",
"year": {
"2015": {
"id": "27",
"value": "60200"
},
"2016": {
"id": "41",
"value": "61516"
},
"2018": {
"id": "7",
"value": ""
}
},
"avg": 2.14
},
and this is my mainactivity
try {
JSONObject jsonObject = new JSONObject(s);
JSONArray array = jsonObject.getJSONArray("data");
// JSONArray array = new JSONArray(s);
for (int i = 0; i < array.length(); i ++) {
JSONObject o = array.getJSONObject(i);
String id = o.getString("id");
String kec = o.getString("kecamatan");
String avg = o.getString("avg");
String tahun = o.getString("year");
// JSONArray array2 = o.getJSONArray("year");
// for (int j = 0; j<array2.length(); j++) {
// JSONObject p = array2.getJSONObject(j);
// String value = p.getString("value");
ListItem item = new ListItem(id, kec, avg, tahun, avg);
listItems.add(item);
// }
}
adapter = new MyAdapter(listItems, getApplicationContext());
recyclerView.setAdapter(adapter);
} catch (JSONException e) {
e.printStackTrace();
}
year is a JSONObject with 2015,2016 and 2018 as keys and JSONObject as values, So get year JSONObject and then get keys and values by iterating it
for (int i = 0 ; i<array.length(); i++) {
JSONObject o = array.getJSONObject(i);
String id = o.getString("id");
String kec = o.getString("kecamatan");
String avg = o.getString("avg");
JSONObject yearObject = o.JSONObject("year"); //get JSONObject
Iterator<String> itr = yearObject.keys();
while(itr.hasNext()) {
String year = itr.next();
JSONObject obj = o.get("year"); //2015
System.out.println(obj.getString("id")); //27
System.out.println(obj.getString("value")); //60200
}
//Add required fields into `ListItem`
ListItem item = new ListItem(id,kec,avg,tahun,avg);
listItems.add(item);
}
I get the request but i can't get the jsonarray from json object.
JSONObject ob = JSONObject.fromObject(response.toString());
JSONArray arr = ob.getJSONArray("results");
for (int i = 0; i < arr.size(); i++) {
JSONObject jsonAuth = arr.getJSONObject(i);
String PREFIX = jsonAuth.get("PREFIX").toString();
}
my json:
{
"d": {
"results": [{
"__metadata": {
"type": "ceodo.cco.loc_do.OdataV2.SecuenciasType",
"uri": "com:443/ceodo/cco/loc_do/OdataV2.xsodata/Secuencias('d76fffbe-8c3b-4c66-bd7f-16c9d099d143')"
},
"SEC_ID": "d76fffbe-8c3b-4c66-bd7f-16c9d099d143",
"PREFIX": "B",
"TIPO_NCF": "01",
"NUM_FROM": 50,
"NUM_TO": 100,
"NUM_CURRENT": 25,
"VALID_UNTIL": "\/Date(1556582400000)\/",
"CAJA": "b1c913fc-e319-476f-8295-64782b77de52"
}, {
"__metadata": {
"type": "ceodo.cco.loc_do.OdataV2.SecuenciasType",
"uri": "com:443/ceodo/cco/loc_do/OdataV2.xsodata/Secuencias('f3323600-6bf2-4e90-8856-56390595d748')"
},
"SEC_ID": "f3323600-6bf2-4e90-8856-56390595d748",
"PREFIX": "B",
"TIPO_NCF": "02",
"NUM_FROM": 1,
"NUM_TO": 100,
"NUM_CURRENT": 35,
"VALID_UNTIL": "\/Date(1554249600000)\/",
"CAJA": "c90030fb-030b-4a99-929a-adc72eaf082f"
}]
}
}
Well, you can call the 'd' object first.
The sequence of your json file should be from a d(JSONObject) tag to a results(JSONArray) tag.
Here is code by using another json library
import org.json.JSONArray;
import org.json.JSONObject;
... skip ...
//JSONObject ob = JSONObject.fromObject(resBuf.toString());
JSONObject ob = new JSONObject(resBuf.toString());
if(ob.has("d"))
{
JSONObject dobj = ob.getJSONObject("d");
if(dobj.has("results"))
{
JSONArray arr = dobj.getJSONArray("results");
System.out.println(arr.length());
for (int i = 0; i < arr.length(); i++) {
JSONObject jsonAuth = arr.getJSONObject(i);
String PREFIX = jsonAuth.get("PREFIX").toString();
System.out.println(PREFIX);
}
}
}
courseName name is clear and I cannot put any value in model class.
private static List<Country> countries = new ArrayList<>();
private ArrayList<String> courseName = new ArrayList<>();
JSONArray datalist = data.optJSONArray("data_list");
for (int i = 0; i < datalist.length(); i++) {
JSONObject jsonObject = datalist.getJSONObject(i);
/*strTitle.add(jsonObject.optString("cat_name_lan1"));
courceidtitle.add(jsonObject.optString("cat_id"));
courseName.clear();*/
strTitle = jsonObject.optString("cat_name_lan1");
JSONArray courseArray = jsonObject.optJSONArray("courses_array");
if (courseArray != null && courseArray.length() > 0) {
JSONObject courceName;
for (int j = 0; j < courseArray.length(); j++) {
courceName = courseArray.optJSONObject(j);
/*courceidchild.add(courceName.optString("cat_id"));*/
courseName.add(courceName.optString("course_name_lan1"));
}
countries.add(new Country(strTitle, courseName));
} else {
countries.add(new Country(strTitle, courseName));
}
courseName.clear();
}
My JSON,
{
"data": {
"data_list": [
{
"cat_id": "5",
"cat_name_lan1": "Office Productivity",
"cat_name_lan2": "ऑफिस प्रोडक्टिविटी",
"cat_name_lan3": "ઓફિસ પ્રોડક્ટિવિટી",
"cat_name_lan4": null,
"cat_name_lan5": null,
"cat_name_lan6": null,
"courses_array": [
{
"course_id": "6",
"course_name_lan1": "Google Docs Primary Level ",
"course_name_lan2": "गुगल डॉक्स प्राथमिक स्तर",
"course_name_lan3": "ગુગલ ડોક્સ પ્રાથમિક સ્તર",
"course_name_lan4": "",
"course_name_lan5": "",
"course_name_lan6": "",
"course_take": 1
},
{
"course_id": "61",
"course_name_lan1": "Financial Function Excel 2016",
"course_name_lan2": "फाइनैन्शल फंक्शन एक्सेल 2016",
"course_name_lan3": "ફાઇનૈન્શલ ફંક્શન એક્સેલ 2016",
"course_name_lan4": "",
"course_name_lan5": "",
"course_name_lan6": "",
"course_take": 0
}
]
},
{
"cat_id": "4",
"cat_name_lan1": "I.T. & Software",
"cat_name_lan2": "आईटी & सोफ्टवेयर",
"cat_name_lan3": "આઈટી & સોફ્ટવેર",
"cat_name_lan4": null,
"cat_name_lan5": null,
"cat_name_lan6": null,
"courses_array": [
{
"course_id": "18",
"course_name_lan1": "Google Forms",
"course_name_lan2": "गुगल फॉर्म्स ",
"course_name_lan3": "ગુગલ ફોર્મ્સ ",
"course_name_lan4": "",
"course_name_lan5": "",
"course_name_lan6": "",
"course_take": 0
},
{
"course_id": "62",
"course_name_lan1": "Google Drive",
"course_name_lan2": "गुगल ड्राईव",
"course_name_lan3": "ગુગલ ડ્રાઈવ ",
"course_name_lan4": "",
"course_name_lan5": "",
"course_name_lan6": "",
"course_take": 1
}
]
}
],
"status": 0,
"message": "Category and courses tree view."
}
}
courseName array is clear out of for loop hence I am getting blank value in model class.
Update your code to
JSONArray courseArray = jsonObject.optJSONArray("courses_array");
if (courseArray != null && courseArray.length() > 0) {
for (int j = 0; j < courseArray.length(); j++) {
// here you should initialize your courceName
JSONObject courceName = courseArray.optJSONObject(j);
courseName.add(courceName.optString("course_name_lan1"));
}
}
countries.add(new Country(strTitle, courseName));
Try this code,
// Initialize countries list
List<Country> countries = new ArrayList<>();
JSONObject jObj = new JSONObject(json);
JSONObject data = jObj.optJSONObject("data");
JSONArray datalist = data.optJSONArray("data_list");
// Iterate data_list JSONArray
for (int i = 0; i < datalist.length(); i++) {
JSONObject jsonObject = datalist.getJSONObject(i);
String strTitle = jsonObject.optString("cat_name_lan1");
// Initialize courseName here
ArrayList<String> courseName = new ArrayList<>();
JSONArray courseArray = jsonObject.optJSONArray("courses_array");
// Iterate courses_array JSONArray
for (int j = 0; j < courseArray.length(); j++) {
JSONObject courceName = courseArray.optJSONObject(j);
courseName.add(courceName.optString("course_name_lan1"));
}
// Add strTitle and courseNames to countries list
countries.add(new Country(strTitle, courseName));
}
I'm getting this string (from webservice) into a JSONArray,
[{
"textinput": [{
"position": 0,
"dependency": "no",
"id": 0,
"Itype": "textinput"
}, {
"position": 2,
"dependency": "no",
"id": 1,
"Itype": "textinput"
}]
}, {
"textarea": [{
"position": 1,
"type": "textarea",
"dependency": "no",
"id": 0
}]
}]
I need to sort the array by ascending order based on key-"position"
I am using org.json library, the below code is the one so far the code i used
JSONArray sortedJsonArray = new JSONArray();
List<JSONObject> jsonList = new ArrayList<JSONObject>();
for (int i = 0; i < jsonArray.length(); i++) {
jsonList.add(jsonArray.getJSONObject(i));
}
Collections.sort( jsonList, new Comparator<JSONObject>() {
public int compare(JSONObject a, JSONObject b) {
String valA = new String();
String valB = new String();
try {
valA = (String) a.get("position");
valB = (String) b.get("position");
}
catch (JSONException e) {
//do something
}
return valA.compareTo(valB);
}
});
for (int i = 0; i < jsonArray.length(); i++) {
sortedJsonArray.put(jsonList.get(i));
}
AALso tried other links in the site.
please help
Try TreeMap, it will automatically sort the array for you. All you have to do is make "position" the Key of TreeMap and JSONObject the value. The treemap will arrange the values in ascending order of the keys.And then you can retrieve the JSONObject values from the treemap.
private TreeMap<Integer,JSONObject> sortedarray = new TreeMap<Integer,JONObject>();
for (int i = 0; i < jsonArray.length(); i++) {
try {
sortedarray.put(Integer.parseInt(jsonArray.getJSONObject(i).get("position")+""),jsonArray.getJSONObject(i));
} catch (JSONException e) {
e.printStackTrace();
}
}
Now if you want it to be a jsonArray only..
JSONArray sortedJsonArray = new JSONArray();
for(int x = 0; x<sortedarray.size();x++)
{
//assuming that positions you get in JSON are always complete like 1,2,3,4,....,10,...,100.
sortedJsonArray.put(sortedarray.get(x));
//assuming that positions you get in JSON are not always complete like 1,3,4,..,10,13,...,100.( misses a few numbers in between like 2 and 11 in this case)
sortedJsonArray.put(sortedarray.get(Integer.parseInt(advanceplay.get(advanceplay.keySet().toArray()[i]))));
}
I'm having some trouble with parsing an FQL multiquery for Facebook. I don't know how I need to handle the JSONArray with the same name in the result -> fql_result_set. Here is the FQL JSON I got.
{
"data": [
{
"name": "query1",
"fql_result_set": [
{
"uid": uid1,
"eid": eid1,
"rsvp_status": "attending"
},
{
"uid": uid2,
"eid": eid2,
"rsvp_status": "attending"
},
{
"uid": uid3,
"eid": eid3,
"rsvp_status": "attending"
}
]
},
{
"name": "query2",
"fql_result_set": [
{
"uid": uid1,
"name": "name1",
"pic_square": "pic1"
},
{
"uid": uid2,
"name": "name2",
"pic_square": "pic2"
},
{
"uid": uid3,
"name": "name3",
"pic_square": "pic3"
}
]
}
]
}
Here is what I got at the moment in my Java code, but I get nothing in return. The data I get, will eventually go in an ArrayList.
try {
GraphObject go = response.getGraphObject();
JSONObject jso = go.getInnerJSONObject();
JSONArray data = jso.getJSONArray("data");
for(int i = 0; i < data.length(); i++){
JSONObject o1 = data.getJSONObject(i);
JSONArray rs1 = o1.getJSONArray("fql_result_set");
for(int j = 0; j < rs1.length(); j++){
JSONObject rso1 = rs1.getJSONObject(j);
String uid = rso1.getString("uid");
String eid = rso1.getString("eid");
String rsvp = rso1.getString("rsvp_status");
}
JSONObject o2 = data.getJSONObject(i);
JSONArray rs2 = o2.getJSONArray("fql_result_set");
for(int k = 0; k < rs2.length(); k++){
JSONObject rso2 = rs2.getJSONObject(k);
String name = rso2.getString("name");
String pic = rso2.getString("pic_square");
}
}
} catch (JSONException e) {
e.printStackTrace();
}
Does anyone know how I need to parse this JSON result?
Thanks in advance!
Solution
try {
people = new ArrayList<Person>();
GraphObject go = response.getGraphObject();
JSONObject jso = go.getInnerJSONObject();
JSONArray data = jso.getJSONArray("data").getJSONObject(0)
.getJSONArray("fql_result_set");
JSONArray data2 = jso.getJSONArray("data").getJSONObject(1)
.getJSONArray("fql_result_set");
for (int i = 0; i < data.length(); i++) {
Person p = new Person();
JSONObject o1 = data.getJSONObject(i);
uid = o1.getString("uid");
p.setUserId(uid);
p.setRsvp_status(o1.getString("rsvp_status"));
for (int j = 0; j < data2.length(); j++) {
JSONObject o2 = data2.getJSONObject(j);
if (p.getUserId().equals(o2
.getString("uid"))) {
p.setName(o2.getString("name"));
p.setPic(o2.getString("pic_square"));
}
}
people.add(p);
}
} catch (JSONException e) {
e.printStackTrace();
}
// assign the whole result to a JSON Object
JSONObject result = whatever-variable-name
// get 'data' JSONArray
JSONArray array = result.getJSONArray('data')
// loop
for(i = 0; i < array.length(); i++) {
JSONObject obj = array.getJSONObject(i);
**
name = obj.getString('name');
}
** at this point obj is "name": "query1",
"fql_result_set": [
{
"uid": uid1,
"eid": eid1,
"rsvp_status": "attending"
},
{
"uid": uid2,
"eid": eid2,
"rsvp_status": "attending"
},
{
"uid": uid3,
"eid": eid3,
"rsvp_status": "attending"
}
]
and name has the value query1 or query2 depending on the loop count. You could you the methods used so far to gain access to fql_result_set": [
{
"uid": uid1,
"eid": eid1,
"rsvp_status": "attending"
},
{
"uid": uid2,
"eid": eid2,
"rsvp_status": "attending"
},
{
"uid": uid3,
"eid": eid3,
"rsvp_status": "attending"
}
] GLHF!
Try this:
String strEvents = new JSONArray(apiResponse).getJSONObject(0).toString();
String strVenues= new JSONArray(apiResponse).getJSONObject(1).toString();
jsonArray = new JSONObject(strEvents).getJSONArray("fql_result_set");
jsonVenues = new JSONObject(strVenues).getJSONArray("fql_result_set");