Generating menu items from JSON file in Android - java

By reading a JSON file from a local folder, Im trying to generate drawer menu having child items. readJsonDataFromFile(); returns the JSON string. Im using the following code to generate menu.
lstChild = new TreeMap<>();
try {
String jsonDataString = readJsonDataFromFile();
JSONArray menuItemsJsonArray = new JSONArray(jsonDataString);
for (int i = 0; i < menuItemsJsonArray.length(); ++i) {
JSONObject menuItemObject = menuItemsJsonArray.getJSONObject(i);
String catName = menuItemObject.getString("cname");
JSONArray scatJsonArray = new JSONArray(menuItemObject.getString("csubcat"));
for (int j = 0; j < scatJsonArray.length(); ++j) {
JSONObject scatItemObject = scatJsonArray.getJSONObject(j);
//********GENERATING CHILD ITEMS HERE***********
}
lstChild.put(catName,childItem);
}
} catch (IOException | JSONException exception) {
Log.e(HomeActivity.class.getName(), "Unable to parse JSON file.",exception);
}
lstTitle = new ArrayList<>(lstChild.keySet());
I want to generate child items (childItem) and expected record set is like
List<String> childItem = Arrays.asList("Beginner","Intermediate","Advanced","Professional");
JSON string
[
{
"cid": "1",
"cname": "WATCHES",
"cimg": "074321.png",
"csubcat": [
{
"sid": "1",
"sname": "FASTTRACK"
},
{
"sid": "2",
"sname": "TIMEX"
},
{
"sid": "3",
"sname": "ROADSTER"
},
{
"sid": "4",
"sname": "TITAN"
}
]
}
]
Im beginner to Android/Java. Thanks in advance

try {
String jsonDataString = readJsonDataFromFile();
JSONArray menuItemsJsonArray = new JSONArray(jsonDataString);
for (int i = 0; i < menuItemsJsonArray.length(); ++i) {
JSONObject menuItemObject = menuItemsJsonArray.getJSONObject(i);
String catName = menuItemObject.getString("cname");
JSONArray scatJsonArray = new JSONArray(menuItemObject.getString("csubcat"));
List<String> childItem = new ArrayList<>();
for (int j = 0; j < scatJsonArray.length(); ++j) {
JSONObject scatItemObject = scatJsonArray.getJSONObject(j);
childItem.add(scatItemObject. getString("sname"));
}
lstChild.put(catName,childItem);
}
} catch (IOException | JSONException exception) {
Log.e(HomeActivity.class.getName(), "Unable to parse JSON file.",exception);
}

Related

How can i go through this json in java?

I am working on an Android project, in which I am using Volley to consume an Api. The query is being done correctly and the next JSON returns to me. I am trying to access the elements of this jsonArray in java
[
{
"Estado": 1,
"_id": "5dfd27fb971f730f31cc12d5",
"empresas": "5dfbeec1f87e0e3030b38143",
"Codigo": "1001AZXL001",
"Codigo_Barras": "7702345654127",
"Descripcion": "JEAN talla XL ",
"Detalles": [
{
"_id": "5dfd27fb971f730f31cc12d7",
"bodegas": "5dfd2383971f730f31cc12cf",
"Cantidad": 6,
"Precio": 150000,
"Unidad_Medida": "UND"
},
{
"_id": "5dfd27fb971f730f31cc12d6",
"bodegas": "5dfd23b7971f730f31cc12d0",
"Cantidad": 15,
"Precio": 150000,
"Unidad_Medida": "UND"
}
],
"Talla": "XL",
"Color": "AZ",
"Minimo": 5000,
"Maximo": 30000,
"Fecha_Creacion": "2019-12-20T19:58:51.720Z"
}
]
For that I am using the following code
public void onResponse(JSONArray jsonArray) {
for(int i = 0; i < jsonArray.length(); i++) {
try {
JSONObject jsonObject = jsonArray.getJSONObject(i);
descripcionProducto = jsonObject.getString("Descripcion");
tallaProducto = jsonObject.getString("Talla");
txtDescripcion.setText(descripcionProducto);
txtUnidades.setText(tallaProducto);
}
catch(JSONException e) {
}
}
}
But I cannot access the elements that are inside the "Detalles" object
Use the following :
public void onResponse(JSONArray jsonArray) {
for(int i = 0; i < jsonArray.length(); i++) {
try {
JSONObject jsonObject = jsonArray.getJSONObject(i);
descripcionProducto = jsonObject.getString("Descripcion");
tallaProducto = jsonObject.getString("Talla");
txtDescripcion.setText(descripcionProducto);
txtUnidades.setText(tallaProducto);
JSONArray array = jsonObject.getJSONArray("Detalles")
for(int j = 0; j < array.length() ; ++j){
try{
JSONObject jsonObject2 = array.getJSONObject(j);
//ACCESS THE PARAMETERS OF detalles HERE FOR EX :
String bodegas = jsonObject2.getString("bodegas");
}catch(JSONException e) {}
}
}
catch(JSONException e) {
}
}
}
This is another Jsonarray, if you want to get the data inside, you Need to get the Jsonarray and read the data from there.
JSONArray array = jsonObject.getJSONArray("Detalles")
If you want the Data inside this Array you can Access them as you already did

Compare list of JSONArray in ArrayList

I have an ArrayList containing a list of JSONArrays
staffArray = new ArrayList<JSONArray>();
the JSONArray is in a form of this:
[
{
"id": "k40dn-dff02-mm1",
"name": "staff1",
"tel": "0123456789",
},
{
"id": "ch2mq-pmw01-ps6",
"name": "staff2",
"tel": "9876543210",
}
...
]
And the ArrayList will be containing different sizes of JSONArray.
Now I want to check in the ArrayList for each JSONArray, if they contain the same value for "id". So say that if the ArrayList has three different sizes of JSONArray, how can I tell the they each contain a JSONObject with the same value for "id" in it.
So far I have tried this to extract the string:
for(int i = 0; i < staffArray.size(); i++){
JSONArray jsonArray = new JSONArray();
jsonArray = staffArray.get(i);
for(int j = 0; j < jsonArray.length(); j ++){
JSONObject json = null;
try {
json = jsonArray.getJSONObject(j);
String id = json.getString("id");
} catch (JSONException e) {
e.printStackTrace();
}
}
}
If you would like to check for duplicate IDs in your ArrayList, you could do something like this:
ArrayList<JSONArray> staffArray = new ArrayList<>();
Set<String> ids = new HashSet<>();
for (JSONArray array : staffArray) {
for (int i = 0; i < array.length(); i++) {
JSONObject obj = array.getJSONObject(i);
if (!ids.add(obj.getString("id"))) {
// duplicate IDs found, do something
}
}
}
How about using group by to group the json arrays with same id something like this
public static void groupById(List<JSONArray> staffArray) {
Map<String, List<JSONArray>> jsonArraysById = staffArray.stream().collect(Collectors.groupingBy(jsonArray -> getIdFromJsonArray(jsonArray)));
jsonArraysById.forEach((id, arrays) -> {
System.out.println("Arrays with id " + id + " are " + arrays);
});
}
public static String getIdFromJsonArray(JSONArray jsonArray) {
String result = null;
for (int j = 0; j < jsonArray.length(); j++) {
JSONObject json = null;
try {
json = jsonArray.getJSONObject(j);
result = json.getString("id");
} catch (JSONException e) {
e.printStackTrace();
}
}
return result;
}

How to parse this JSON, android?

I have the below JSON
{"data":{
"result": true,
"applications": [
{
"application_name": "Hill Rider Game",
"application_os": "Android",
"app_downloads": "1,000,000+",
"bundle_id": "com.touchfoo.swordigo",
"playstore": {
"downloads": "1,000,000 - 5,000,000",
"rating": 4.3144540786743,
"developer": "Touch Foo",
"screenshots": [
"https://lh4.ggpht.com/B8xLNXsT_OOezuHDMtX1ZqRgEX_D8NV79bktaLpJ41Rh9Ng8dJ_vC35mEmXiT4iOrhc=h310",
"https://lh6.ggpht.com/VCWp2ltqspB2qjznCeq9hhMwdG10nxYfg2URbH1_F8cmdtkW-MLCS0aJUnZ-IvnNXg=h310",
"https://lh4.ggpht.com/DJqmDOgAqC_COJI5AVTxWeehcM6B51bFkedVRIG0iQdrxsHf42Dy0-NPDfw5nhnXDEOB=h310",
"https://lh5.ggpht.com/E0VlpwiBGTBPnCpzekxv6kJG1FCaPQENuxXi1OUu9jGv7Ib-vc4j4AkaGugz7bjhg94-=h310"
]
}
},
{
"application_name": "Appprix Testing",
"application_os": "Android",
"app_downloads": "10,000,000+",
"bundle_id": "com.creativemobile.dragracingbe",
"playstore": {
"downloads": "10,000,000 - 50,000,000",
"rating": 4.2277860641479,
"developer": "Creative Mobile",
"screenshots": [
"https://lh6.ggpht.com/mZxezzFUAyRz7g2zcULV8vLILrMs6yuP_Yux60F3DPA7x89TIlLzgWkDgyQFhugAMQc=h310",
"https://lh4.ggpht.com/iapxrJoX2u-O3wvh9i9J6L4_tmyoflj2OGbZCe8xdJiqb8EE8yIH3lzE1h0UinfqDQ=h310",
"https://lh5.ggpht.com/YgDWaxt00LBEd-5p-AfVhAxf7u45m82mD2Uk44wkQm0QBCxEMYX4rrUaWDaS9PEvTSE=h310",
"https://lh6.ggpht.com/k5ixEniw9F6sZ-B0HU2ckEHg9tBsjMz45xZ2LX3-hcjLcFTT4_VZfTBkbqVYDXnlYSQ=h310"
]
}
},
{
"application_name": "Hill Climb SteamPunk",
"application_os": "Android",
"app_downloads": "1,000,000+",
"bundle_id": "com.touchfoo.swordigo",
"playstore": {
"downloads": "1,000,000 - 5,000,000",
"rating": 4.3144540786743,
"developer": "Touch Foo",
"screenshots": [
"https://lh4.ggpht.com/B8xLNXsT_OOezuHDMtX1ZqRgEX_D8NV79bktaLpJ41Rh9Ng8dJ_vC35mEmXiT4iOrhc=h310",
"https://lh6.ggpht.com/VCWp2ltqspB2qjznCeq9hhMwdG10nxYfg2URbH1_F8cmdtkW-MLCS0aJUnZ-IvnNXg=h310",
"https://lh4.ggpht.com/DJqmDOgAqC_COJI5AVTxWeehcM6B51bFkedVRIG0iQdrxsHf42Dy0-NPDfw5nhnXDEOB=h310",
"https://lh5.ggpht.com/E0VlpwiBGTBPnCpzekxv6kJG1FCaPQENuxXi1OUu9jGv7Ib-vc4j4AkaGugz7bjhg94-=h310"
]
}
},
{
"application_name": "abcd",
"application_os": "Android",
"app_downloads": "10,000+",
"bundle_id": "com.piggypop.cricket",
"playstore": {
"downloads": "10,000 - 50,000",
"rating": 3.9359374046326,
"developer": "Piggy Pop",
"screenshots": [
"https://lh3.ggpht.com/vvpskwV3TfsrzkmLXF4_NIEY-fzKYFjiXtpF8C2ovS6mJlfYG4dkGAYsSWHbv1lzmw=h310",
"https://lh5.ggpht.com/RrfwHr3lEfaqOtg_Hoa30EMuP9cS_GW4fAeZH_W3SCcubi1IiqV5OpuyMTWT8gPbwQ=h310",
"https://lh4.ggpht.com/WdivGfxtUAKPxhMGayfLD5egCm3y0mz8RBQcyCnQBhuHAE_a5deZmAv4evkwGny6eHQ=h310",
"https://lh5.ggpht.com/sbLzAUgprB8vQkqLMgqdAz2TyI5az572scxVuPoHa8I2zk7B5euCebx3ECr4iOHLxvA=h310",
"https://lh5.ggpht.com/6Vk9DTDY4Grcn_OaiaJmEuaR2fi94H55PyEYg9NhbPAoxjRnMgt7oZBaA1SQLVfSj1w=h310"
]
}
}
]
}
}
I need to get "screenshots" tag array. This is my code
JSONArray responseArray = jsonObj.getJSONArray("body");
for (int i = 0; i < responseArray.length(); i++) {
JSONArray applicationsArray = c.getJSONArray("applications");
for (int k = 0; k < applicationsArray.length(); k++) {
JSONObject e = applicationsArray.getJSONObject(k);
JSONArray playstore = e.getJSONArray("playstore");
for (int l = 0; l < playstore.length(); l++) {
JSONObject f = playstore.getJSONObject(l);
Log.e("scren ",""+f.getString("screenshots"));
JSONArray screenshotArray = f.getJSONArray("screenshots");
Log.e("scren ",""+screenshotArray);
}
}
jsonObj contain json value
JSONObject data = jsonObj.getJSONObject("data");
JSONArray applications = data.getJSONArray("applications");
for (int k = 0; k < applications.length(); k++) {
JSONObject playstore = applications[k].getJSONObject("playstore");
JSONArray screenshots = playstore.getJSONArray("screenshots");
for (int i = 0; i < screenshots.length(); i++) {
Log.e("screenshot ",""+screenshots[i]);
}
}
you can try like this
Assuming you already have setup all the prerequisites for json parsing in android.
I will move towards how to parse this data
if(response!=null){
try {
JSONObject jsonObject = new JSONObject(response);
JSONObject data = jsonObject.getJSONObject("data");
JSONArray jsonArray = jsonObject.optJSONArray("applications");
for(int i=0; i<jsonArray.length(); i++){
jsonObject= jsonArray.getJSONObject(i);
JSONObject c = jsonArray.getJSONObject(i);
String app_name = c.getString("application_name");
String app_os = c.getString("application_os");
String app_downloads = c.getString("app_downloads");
String bundle = c.getString("bundle_id");
// playstore node is JSON Object
JSONObject playstore = c.getJSONObject("playstore");
String downloads = phone.getString("downloads");
String rating = phone.getString("rating");
String developer = phone.getString("developer");
// screenshots node is JSON Array
JSONArray screenshots = jsonObject.optJSONArray("screenshots");
for(int j=0; j<screenshots.length(); j++){
Log.e("screenshot ",""+screenshots[i]);
}
}
} catch (JSONException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}

How to access JSONArray inside of a JSONArray in a JSON object response

Within this Json response, how do I get access to "smallImageUrls" and get the image url using Java?
Seems like "smallImageUrls" is an array within the "matches" jsonarray. Someone please correct me if I am wrong on that.
{
"attribution":{
"html":"Recipe search powered by <a href='http://www.yummly.com/recipes'><img alt='Yummly' src='http://static.yummly.com/api-logo.png'/></a>",
"url":"http://www.yummly.com/recipes/",
"text":"Recipe search powered by Yummly",
"logo":"http://static.yummly.com/api-logo.png"
},
"totalMatchCount":17663,
"facetCounts":{
},
"matches":[
{
"imageUrlsBySize":{
"90":"http://lh3.ggpht.com/bTkxROvVTjHChEsGLRnkuwPoi-eNrHmESYP3xDHMsIisN-U06z-OfwErSjT5AHvMG0Ccgw8cN4mVqNyjWzbz=s90-c"
},
"sourceDisplayName":"Serious Eats",
"ingredients":[
"mayonnaise",
"crema mexican",
"feta",
"ancho powder",
"garlic",
"coriander leaf",
"shuck corn",
"lime"
],
"id":"Mexican-street-corn-_elotes_-370469",
"smallImageUrls":[
"http://lh5.ggpht.com/itong2VhnBU2mvPtzNimL58MnkC4l113RgNyrEWq8Jf76AsOGOlBoVQyCF-jYDPtzTB-7SoViNzyV5-Xe0NS=s90"
],
"recipeName":"Mexican Street Corn (Elotes)",
"totalTimeInSeconds":2400,
"attributes":{
"cuisine":[
"Mexican"
]
},
"flavors":{
"sweet":0.5,
"sour":0.6666666666666666,
"salty":0.6666666666666666,
"piquant":0.3333333333333333,
"meaty":0.3333333333333333,
"bitter":0.6666666666666666
},
"rating":5
}
],
"criteria":{
"excludedIngredients":null,
"allowedIngredients":null,
"terms":null
}
}
this is the code that I currently have. I can access all the other strings, just not the image urls .
JSONObject resObj = new JSONObject(result);
JSONArray foundrecipes = resObj.getJSONArray("matches");
for(int i = 0;i<foundrecipes.length(); i++){
JSONObject recipe = foundrecipes.getJSONObject(i);
String recipeName = recipe.getString("recipeName");
String rating = recipe.getString("rating");
String id = recipe.getString("id");
String imageurl = recipe.getString("smallImageUrls");
data.add(new Recipes(recipeName, rating, id, imageurl));
}
smallImageUrls, is inside matches that is inside the root, so you have to retrieve matches and, through it, smallImageUrls
JSONObject obj = new JSONObject(...);
JSONArray matches = obj.optJSONArray("matches");
if (matches != null) {
for (int i = 0; i < matchesLenght; i++) {
JSONObject objAtIndex = matches.optJSONObject(i);
if (objAtIndex != null) {
JSONArray smallImageUrls = objAtIndex.optJSONArray("smallImageUrls");
for (int j = 0; j < smallImageUrlsSize; j++) {
String urlAtIndex = smallImageUrls.optString(j);
}
}
}
}

Error parsing data.org.json.JSONException value of type java.lang.String cannot be converted to JSONArray

i am getting this error using php-mysql and json, seriously i have spent 2 days, so here is my codes
require "includes/connexion.php";
$requete="SELECT * FROM contacts;";
$rep=$pdo->query($requete);
while($data=$rep->fetch(PDO::FETCH_ASSOC)){
$sortie[]=$data;
}
print(json_encode($sortie));
$rep->closeCursor();
here is a part of the java code and the jsonArray in the results parameter contains that value(from the console):
 [{"id":"1","nom":"Fedson Dorvilme","email":"fedsondorvilme#gmail.com","phone":"34978238","img":"ic_launcher"},{"id":"2","nom":"Darlene Aurelien","email":"darleneaurelien#yahoo.fr","phone":"34171191","img":"ic_launcher"}]
JSONArray array = new JSONArray(result);
for (int i = 0; i < array.length(); i++) {
JSONObject json_data = array.getJSONObject(i);
Log.i("MyLogFlag", "Nom Contact: " + json_data.getString("nom"));
returnString = "\n\t" + array.getJSONArray(i);
System.out.println(" ********** RS [ "+returnString+" ]****************");
}
} catch (Exception e) {
Log.e("log_Exception_tag", "Error parsing data " + e.toString());
}
thanks in advance for your help
This is your json structure:
[
{
"id": "1",
"nom": "Fedson Dorvilme",
"email": "fedsondorvilme#gmail.com",
"phone": "34978238",
"img": "ic_launcher"
},
{
"id": "2",
"nom": "Darlene Aurelien",
"email": "darleneaurelien#yahoo.fr",
"phone": "34171191",
"img": "ic_launcher"
}
]
From your Java code:
JSONArray array = new JSONArray(result); // OK
for (int i = 0; i < array.length(); i++) {
JSONObject json_data = array.getJSONObject(i); // OK
returnString = "\n\t" + array.getJSONArray(i); // ??? wrong!!
}
You try to get Array from array but its JSONObject.
Proper way:
JSONArray gb = new JSONArray(str);
for (int j = 0; j < gb.length(); j++) {
JSONObject element = gb.getJSONObject(j);
int id = element.getInt("id");
int phone = element.getInt("phone");
String nom = element.getString("nom");
String email = element.getString("email");
String img = element.getString("img");
}

Categories

Resources