Get specific index of JSON Nested objects in java Android - java

How I can get only the "name" string of every object under "fields" Array, of main Array index at 0 & then next index using loop or with something super idea
[
{
"name": "Bank1",
"fields": [
{
"name": "Email",
"slug": "email",
"type": "input"
},
{
"name": "City",
"slug": "city",
"type": "input"
},
{
"name": "Screenshot",
"slug": "screenshot",
"type": "file"
},
{
"name": "Full Name",
"slug": "full-name",
"type": "input"
}
],
"status": "Active"
},
{
"name": "Bank2",
"fields": [
{
"name": "Email",
"slug": "email",
"type": "input"
},
{
"name": "City",
"slug": "city",
"type": "input"
},
{
"name": "Screenshot",
"slug": "screenshot",
"type": "file"
},
{
"name": "Submitted Date",
"slug": "submitted-date",
"type": "calendar"
}
],
"status": "Active"
}
]
Output I want:
Email
City
Screenshot
Full Name
Means in the output, I have got index 0, first object array data...
What I have done yet
public void onResponse(String response) {
try {
JSONArray jsonArray = new JSONArray(response);
for (int i = 0; i < jsonArray.length(); i++) {
JSONObject jsonObject = jsonArray.getJSONObject(i);
String p_name = jsonObject.getString("name");
ArrayList<String> arr = new ArrayList<>();
JSONArray ja = jsonObject.getJSONArray("fields");
int len = ja.length();
for (int j = 0; j < len; j++) {
JSONObject json = ja.getJSONObject(j);
arr.add(json.getString("name"));
}
}}catch block...
this gives me all indexes name data i want only specific index data
My Current Output:
Email
City
Screenshot
Full Name
Email
City
Screenshot
Submitted Date

If you want to get specific index data then you should pass if condition in for loop.
EX: to get output of index 0 like,
Email
City
Screenshot
Full Name
Your code would be like below.
public void onResponse(String response) {
try {
JSONArray jsonArray = new JSONArray(response);
for (int i = 0; i < jsonArray.length(); i++) {
if(i==0){
JSONObject jsonObject = jsonArray.getJSONObject(i);
String p_name = jsonObject.getString("name");
ArrayList<String> arr = new ArrayList<>();
JSONArray ja = jsonObject.getJSONArray("fields");
int len = ja.length();
for (int j = 0; j < len; j++) {
JSONObject json = ja.getJSONObject(j);
arr.add(json.getString("name"));
}
}
}}catch block...

int i=gotIndex;//here you can give your exact index that you want
JSONObject jsonObject = jsonArray.getJSONObject(i);
String p_name = jsonObject.getString("name");
ArrayList<String> arr = new ArrayList<>();
JSONArray ja = jsonObject.getJSONArray("fields");
int len = ja.length();
for (int j = 0; j < len; j++) {
JSONObject json = ja.getJSONObject(j);
arr.add(json.getString("name"));
}
here you used the loop you can use the json object out side the loop with using the index number i (jsonObject = jsonArray.getJSONObject(i))

Related

How to fetch json inside json inside another json?

I am new to android and json. I want to implement some logic where i can get the data from sub1 from json inside json inside another json.
Is there any way to get that data?
This is how my json file looks like.
{
"Aeronautical": [],
"Automobile": [],
"Civil": [],
"Computer": [
{
"sub1": [
{
"id": "1",
"name": "name1",
"year": "2019",
"url": "some_url"
},
{
"id": "2",
"name": "Name 2",
"year": "2018",
"url": "some url"
},
{
"id": "3",
"name": "Name 4",
"year": "2018",
"url": "some url"
}
]
}
]
}
sub1 is inside another array , so first you should get data from computer array
JSONObject obj = null;
try {
obj = new JSONObject(json);
JSONArray arr = obj.getJSONArray("Computer");
for (int i = 0; i < arr.length(); i++)
{
JSONObject obj_computers = arr.getJSONObject(i);
JSONArray sub1 = obj_computers.getJSONArray("sub1");
for (int j = 0; j < sub1 .length(); j++)
{
JSONObject sub1_data = sub1.getJSONObject(j);
Log.i("test" ,sub1_data.toString());
}
}
} catch (JSONException e) {
e.printStackTrace();
}
The Android SDK includes the org.json lib. You can use the JSONObject class.
String jsonString = /* obtain some JSON however you need to*/;
JSONObject root = new JSONObject(jsonString);
JSONObject sub1 = root.getJSONObject("sub1");
I omitted exception handling, but this is the basic idea.

I am getting error parsing the given value when tried to parse the given json format android

I have the below following type of json structure which is coming from url.
[{
"id": 1,
"name": "TV",
"fromcenter": {
"car": "60 Mins",
"bus": "20 Mins"
},
"location": {
"latitude": -33.7181,
"longitude": 10.3160
}
}, {
"id": 2,
"name": "Fridge",
"fromcenter": {
"car": "30 Mins"
},
"location": {
"latitude": -33.8433,
"longitude": 11.2411
}
}, {
"id": 3,
"name": "Mixie",
"fromcenter": {
"car": "20 Mins",
"bus": "40 Mins"
},
"location": {
"latitude": -3.8910,
"longitude": 11.27777
}
}]
I am able to parse everything except the "bus" because the bus is not available in id 2. So I am getting error as value "bus" not found. JSONException.
Let me know how to solve this? Below is what I tried.
try {
JSONArray array = new JSONArray(response);
goodModelArrayList = new ArrayList<>();
for (int i = 0; i < array.length(); i++) {
JSONObject e = array.getJSONObject(i);
spinnerModel = new MyTransport();
fromcenter = new Fromcenter();
location = new Location();
for (int j = 0; j < e.length(); j++) {
JSONObject object = e.getJSONObject("location");
latitude = object.getString("latitude");
longitude = object.getString("longitude");
}
for (int k = 0; k < e.length(); k++) {
JSONObject object = e.getJSONObject("fromcenter");
car = object.getString("car");
//bus = object.getString("bus"); //I am not able to get the bus. It throws JSONException error.
}
spinnerModel.setId(String.valueOf(e.getString("id")));
spinnerModel.setName(e.getString("name"));
spinnerModel.setFromcenter(car);
//spinnerModel.setBus(bus); //I am not able to store the datas.
spinnerModel.setLocation(latitude);
spinnerModel.setLocations(longitude);
goodModelArrayList.add(spinnerModel);
}
} catch (Exception e) {
e.printStackTrace();
}
you can interrogate if the object has the property before reading it
if (object.has("bus")) {
bus = object.getString("bus");
}
Straight forward one word.
Use optString instead of getString
optString eliminates this issue. Bus is not present in 2nd item.
So use
String bus= object.optString("bus");

Fetching from db and showing it to the android table

I am trying to fetch data from MySQL table and show it to the Android table.
For table design I am using the following dependencies.
de.codecrafters.tableview:tableview:2.8.0
My JsonArray
{
"result": [
{
"sl": "36",
"user_id": "575512",
"email": "m#gmail.com",
"password": "123",
"name": "Moderator",
"gender": "Male",
"phone": "1223345",
"lvl": "Moderator",
"stat": "1"
},
{
"sl": "68",
"user_id": "814769",
"email": "m2#gmail.com",
"password": "1WCcvnhp",
"name": "Test Moderator",
"gender": "Male",
"phone": "7412589630",
"lvl": "Moderator",
"stat": "1"
},
{
"sl": "69",
"user_id": "742136",
"email": "m3#gmail.com",
"password": "YG5*3Kj9",
"name": "Mod3",
"gender": "Male",
"phone": "1423687450",
"lvl": "Moderator",
"stat": "1"
}
]
}
Till now my code:
JSONArray result = response.getJSONArray("result");
for (int i = 0; i < result.length(); i++) {
JSONObject jsonObject = result.getJSONObject(i);
String name = jsonObject.getString("name");
String phone = jsonObject.getString("phone");
String email = jsonObject.getString("email");
modUpdateAdapter.setName(name);
modUpdateAdapter.setPhone(phone);
modUpdateAdapter.setEmail(email);
arrayList.add(modUpdateAdapter);
}
showData();
And the showData function is
public void showData(){
data = new String[arrayList.size()][10];
for (int j = 0; j < arrayList.size(); j++) {
modUpdateAdapter = arrayList.get(j);
data[j][0] = modUpdateAdapter.getName();
data[j][1] = modUpdateAdapter.getEmail();
data[j][2] = modUpdateAdapter.getPhone();
}
tableView.setDataAdapter(new SimpleTableDataAdapter(getActivity(), data));
}
Problem is that only the last value is shown 3 times, even if I call the showData() inside the for loop. I want to show all 3 objects from the array, not a single object 3 times. Please help me.
You have a problem while you are parsing the data from the JSON and putting the data into an ArrayList of modUpdateAdapter. You are not creating a new instance of ModUpdateAdapter each time you are setting the name, email and phone. So each time you are parsing a data and saving it in the same modUpdateAdapter class. So the function needs to modified like the following.
JSONArray result = response.getJSONArray("result");
for (int i = 0; i < result.length(); i++) {
JSONObject jsonObject = result.getJSONObject(i);
String name = jsonObject.getString("name");
String phone = jsonObject.getString("phone");
String email = jsonObject.getString("email");
// Each time create a new instance and then save the value.
ModUpdateAdapter modUpdateAdapter = new ModUpdateAdapter();
modUpdateAdapter.setName(name);
modUpdateAdapter.setPhone(phone);
modUpdateAdapter.setEmail(email);
arrayList.add(modUpdateAdapter);
}

How to show JSON response in single arrayList?

I am fetching some JSON data with:
for (int i = 0; i < jsonarray.length(); i++) {
jsonobject = jsonarray.getJSONObject(i);
ArrayList<String> listdata = new ArrayList<>();
listdata.add(jsonobject.getString("ans1"));
Log.e("listdata", String.valueOf(listdata));
}
output :
E/listdata: [true]
E/listdata: [false]
but I want to see something like this:
listdata: [true,false]
Edit: The JSON is structured like:
{
"results": [{
"id": 197,
"ans1": "true",
"ans2": null,
"ans3": null,
"ans4": null,
...
}, {
"id": 198,
"ans1": "false",
"ans2": null,
"ans3": null,
"ans4": null,
...
}],
"status": "OK"
}
You can take listdata out of the for loop, such as:
ArrayList<String> listdata = new ArrayList<>();
for (int i = 0; i < jsonarray.length(); i++) {
jsonobject = jsonarray.getJSONObject(i);
listdata.add(jsonobject.getString("ans1"));
}
Log.e("listdata", String.valueOf(listdata));

JSON get Array without object

I'm trying to parse this JSON,
{
"listname": "red",
"lists": [
{
"id": "01",
"name": "paw",
"list": [
{
"id": "A",
"name": "pawa",
"bar": "foo"
},
{
"id": "B",
"name": "pawb",
"bar": "foo"
}
]
},
{
"id": "02",
"name": "pew",
"list": [
{
"id": "A",
"name": "pewa",
"bar": "foo"
},
{
"id": "B",
"name": "pewb",
"bar": "foo"
}
]
},
{
"id": "03",
"name": "piw",
"list": [
{
"id": "A",
"name": "piwa",
"bar": "foo"
},
{
"id": "B",
"name": "piwb",
"bar": "foo"
}
]
}
]
}
I put it on Asset Folder and I read it and it converts it to me to String since here all good, the problem is when I'm trying to get the name from each item of lists and trying to get all the names from the list I've tried it doing this :
JSONObject obj = new JSONObject(str);
JSONArray jsonMainArr = obj.getJSONArray("lists"); //first get the lists
for (int i = 0; i < jsonMainArr.length(); i++) {
JSONObject childJSONObject = jsonMainArr.getJSONObject(i);
String name = childJSONObject.getString("name");
Toast.makeText(context, name, Toast.LENGTH_SHORT).show();
}
JSONObject obj = new JSONObject(str);
JSONArray jsonMainArr = obj.getJSONArray("list"); //get the list
for (int i = 0; i < jsonMainArr.length(); i++) {
JSONObject childJSONObject = jsonMainArr.getJSONObject(i);
String name = childJSONObject.getString("name");
Toast.makeText(context, name, Toast.LENGTH_SHORT).show();
}
But it doesn't show anything... what I'm missing?
EDIT
This is how I read the JSON
public static String loadJSONFromAsset(Context ctx, String str) {
String json = null;
try {
InputStream is = ctx.getAssets().open(str);
int size = is.available();
byte[] buffer = new byte[size];
is.read(buffer);
is.close();
json = new String(buffer, "UTF-8");
} catch (IOException ex) {
ex.printStackTrace();
return null;
}
return json;
}
Since your "list" is nested in the childJSONObject (from "lists") , nest your for loops to retrieve the this set of values (the JSONobject)
JSONObject obj = new JSONObject(str);
//first get the top-level "lists"
JSONArray jsonMainArr = obj.getJSONArray("lists");
for (int i = 0; i < jsonMainArr.length(); i++) {
JSONObject childJSONObject = jsonMainArr.getJSONObject(i);
String name = childJSONObject.getString("name");
Toast.makeText(context, name, Toast.LENGTH_SHORT).show();
//get the inner "list" from childJSONObject
JSONArray childJSONArray = childJSONObject.getJSONArray("list");
for (int j = 0; j < childJSONArray.length(); j++) {
JSONObject childJSONObjectB = childJSONArray.getJSONObject(j);
String name = childJSONObjectB.getString("name");
Toast.makeText(context, name, Toast.LENGTH_SHORT).show();
}
}

Categories

Resources