1

I need to get data from house array, My json file looks like,

{
"mydata": {
"totalRoads": "13",
"noOfHouse": "5",
"house": [
  {
    "road": "1",
    "right": [
      {
        "houseID": "A3",
        "isPainted": "false",
        "ownerGender": "female"
      },
      {
        "houseID": "A4",
        "isPainted": "true",
        "ownerGender": "female"
      }
    ],
    "left": [
      {
        "houseID": "A1",
        "isPainted": "false",
        "ownerGender": "female"
      },
      {
        "houseID": "A2",
        "isPainted": "false",
        "ownerGender": "female"
      }
    ]
  },
  {
    "road": "2",
    "right": [
      {
        "houseID": "B3",
        "isPainted": "false",
        "ownerGender": "male"
      },
      {
        "houseID": "B4",
        "isPainted": "true",
        "ownerGender": "male"
      }
    ],
    "left": [
      {
        "houseID": "B1",
        "isPainted": "true",
        "ownerGender": "male"
      },
      {
        "houseID": "B2",
        "isPainted": "true",
        "ownerGender": "male"
      }
    ]
  },
  {
    "road": "3",
    "right": [
      {
        "houseID": "C3",
        "isPainted": "false",
        "ownerGender": "male"
      },
      {
        "houseID": "C4",
        "isPainted": "false",
        "ownerGender": "male"
      }
    ],
    "left": [
      {
        "houseID": "C1",
        "isPainted": "true",
        "ownerGender": "male"
      },
      {
        "houseID": "C2",
        "isPainted": "false",
        "ownerGender": "male"
      }
    ]
  }
]
}
}

I just tried like this to parse data from json,

InputStream inputStream = getResources().openRawResource(R.raw.house_details);
    ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();

    int ctr;
    try {
        ctr = inputStream.read();
        while (ctr != -1) {
            byteArrayOutputStream.write(ctr);
            ctr = inputStream.read();
        }
        inputStream.close();
    } catch (IOException e) {
        e.printStackTrace();
    }
    Log.v("House Data", byteArrayOutputStream.toString());
    try {
        JSONObject jObject = new JSONObject(
                byteArrayOutputStream.toString());
        JSONObject jObjectResult = jObject.getJSONObject("mydata");
        JSONArray jArray = jObjectResult.getJSONArray("house");
        String house_ID = "";
        boolean is_painted = false;
        String owner_gender = "";
        ArrayList<String[]> data = new ArrayList<String[]>();
        for (int i = 0; i < jArray.length(); i++) {
            house_ID = jArray.getJSONObject(i).getString("houseID");
            is_painted = jArray.getJSONObject(i).getBoolean("isPainted");
            owner_gender = jArray.getJSONObject(i).getString("ownerGender");
            Log.v("house_ID", house_ID);
            Log.v("is_painted", String.valueOf(is_painted));
            Log.v("owner_gender", owner_gender);
            data.add(new String[] { house_ID, String.valueOf(is_painted), owner_gender });
        }
    } catch (Exception e) {
        e.printStackTrace();
    }

But I couldn't get what I am expecting, Please help me get all data from json.

7
  • Json is not valid. Commented Oct 24, 2017 at 6:45
  • @IntelliJAmiya Can u please elaborate why it is not valid? Commented Oct 24, 2017 at 6:48
  • taste here jsonviewer.stack.hu Commented Oct 24, 2017 at 6:51
  • thankyou.. I copied small part from my data. Commented Oct 24, 2017 at 7:02
  • houseID is inside the right array not in house array. may be you forget that line. Commented Oct 24, 2017 at 7:04

8 Answers 8

2

You can use Gson lib to get the data from Json easy way and your structure will be like this

public class Response{

    @SerializedName("mydata")
    private Mydata mydata;

    public void setMydata(Mydata mydata){
        this.mydata = mydata;
    }

    public Mydata getMydata(){
        return mydata;
    }

    @Override
    public String toString(){
        return 
            "Response{" + 
            "mydata = '" + mydata + '\'' + 
            "}";
        }
}

public class Mydata{

    @SerializedName("totalRoads")
    private String totalRoads;

    @SerializedName("noOfHouse")
    private String noOfHouse;

    @SerializedName("house")
    private List<HouseItem> house;

    public void setTotalRoads(String totalRoads){
        this.totalRoads = totalRoads;
    }

    public String getTotalRoads(){
        return totalRoads;
    }

    public void setNoOfHouse(String noOfHouse){
        this.noOfHouse = noOfHouse;
    }

    public String getNoOfHouse(){
        return noOfHouse;
    }

    public void setHouse(List<HouseItem> house){
        this.house = house;
    }

    public List<HouseItem> getHouse(){
        return house;
    }

    @Override
    public String toString(){
        return 
            "Mydata{" + 
            "totalRoads = '" + totalRoads + '\'' + 
            ",noOfHouse = '" + noOfHouse + '\'' + 
            ",house = '" + house + '\'' + 
            "}";
        }
}
public class HouseItem{

    @SerializedName("road")
    private String road;

    @SerializedName("left")
    private List<LeftItem> left;

    @SerializedName("right")
    private List<RightItem> right;

    public void setRoad(String road){
        this.road = road;
    }

    public String getRoad(){
        return road;
    }

    public void setLeft(List<LeftItem> left){
        this.left = left;
    }

    public List<LeftItem> getLeft(){
        return left;
    }

    public void setRight(List<RightItem> right){
        this.right = right;
    }

    public List<RightItem> getRight(){
        return right;
    }

    @Override
    public String toString(){
        return 
            "HouseItem{" + 
            "road = '" + road + '\'' + 
            ",left = '" + left + '\'' + 
            ",right = '" + right + '\'' + 
            "}";
        }
}
Sign up to request clarification or add additional context in comments.

Comments

2

Hi your json is not valid one

           {
"mydata": {
  "totalRoads": "13",
  "noOfHouse": "5",
  "house": [
    {
      "road": "1",
      "right": [
        {
          "houseID": "A3",
          "isPainted": "false",
          "ownerGender": "female"
        },
        {
          "houseID": "A4",
          "isPainted": "true",
          "ownerGender": "female"
        }
      ],
      "left": [
        {
          "houseID": "A1",
          "isPainted": "false",
          "ownerGender": "female"
        },
        {
          "houseID": "A2",
          "isPainted": "false",
          "ownerGender": "female"
        }
      ]
    },
    {
      "road": "2",
      "right": [
        {
          "houseID": "B3",
          "isPainted": "false",
          "ownerGender": "male"
        },
        {
          "houseID": "B4",
          "isPainted": "true",
          "ownerGender": "male"
        }
      ],
      "left": [
        {
          "houseID": "B1",
          "isPainted": "true",
          "ownerGender": "male"
        },
        {
          "houseID": "B2",
          "isPainted": "true",
          "ownerGender": "male"
        }
      ]
    },
    {
      "road": "3",
      "right": [
        {
          "houseID": "C3",
          "isPainted": "false",
          "ownerGender": "male"
        },
        {
          "houseID": "C4",
          "isPainted": "false",
          "ownerGender": "male"
        }
      ],
      "left": [
        {
          "houseID": "C1",
          "isPainted": "true",
          "ownerGender": "male"
        },
        {
          "houseID": "C2",
          "isPainted": "false",
          "ownerGender": "male"
        }
      ]
    }
    ]
}
}


  try {
    JSONObject jObject = new JSONObject(
            byteArrayOutputStream.toString());
    JSONObject jObjectResult = jObject.getJSONObject("mydata");
    JSONArray jArray = jObjectResult.getJSONArray("house");
    String house_ID = "";
    boolean is_painted = false;
    String owner_gender = "";
    ArrayList<String[]> data = new ArrayList<String[]>();
    for (int i = 0; i < jArray.length(); i++) {

        JSONObject obj= jArray.getJSONObject(i);
        JSONArray right = obj.getJSONArray("right");
        JSONArray left= obj.getJSONArray("left");

        for(int j=0;j<right.length();j++)
         {

        house_ID = right.getJSONObject(j).getString("houseID");
        is_painted = right.getJSONObject(j).getBoolean("isPainted");
        owner_gender = right.getJSONObject(j).getString("ownerGender");
        Log.v("house_ID", house_ID);
        Log.v("is_painted", String.valueOf(is_painted));
        Log.v("owner_gender", owner_gender);
        data.add(new String[] { house_ID, String.valueOf(is_painted), 
        owner_gender });
              }

        for(int j=0;j<left.length();j++)
         {

        house_ID = left.getJSONObject(j).getString("houseID");
        is_painted = left.getJSONObject(j).getBoolean("isPainted");
        owner_gender = left.getJSONObject(j).getString("ownerGender");
        Log.v("house_ID", house_ID);
        Log.v("is_painted", String.valueOf(is_painted));
        Log.v("owner_gender", owner_gender);
        data.add(new String[] { house_ID, String.valueOf(is_painted), 
        owner_gender });
              }

    }
       } catch (Exception e) {
       e.printStackTrace();
    }

3 Comments

this is correct one , copy and past in any online json editor and also houseId is inside one more array
Copied from my big data. That is why some tags missed
i added parsing also , check that
2

1- Create a model for houseData i.e.

public class HotelEntity {
    private String houseID;
    private String isPainted;
    private String ownerGender;
    // add getter and setter here    
}

2- Parse data from right and left from each house object

for (int i = 0; i < jArray.length(); i++) {
    //get the data and map it object
    Array.getJSONObject(i).getString("right");

    for {
        // add all models to list
    }

    Array.getJSONObject(i).getString("left");

    for {
        // add all models to list
    }
}

3 Add it in ArrayList of your houseEntity.

Also, you can use Gson for the json to object conversion. You don't have to manually parse data from json.

Comments

2

You can create object from your json String with

http://www.jsonschema2pojo.org/

-----------------------------------com.example.Example.java-----------------------------------

package com.example;

import com.google.gson.annotations.Expose;
import com.google.gson.annotations.SerializedName;

public class Example {

@SerializedName("mydata")
@Expose
private Mydata mydata;

public Mydata getMydata() {
return mydata;
}

public void setMydata(Mydata mydata) {
this.mydata = mydata;
}

}

-----------------------------------com.example.House.java-----------------------------------

    package com.example;

import java.util.List;
import com.google.gson.annotations.Expose;
import com.google.gson.annotations.SerializedName;

public class House {

@SerializedName("road")
@Expose
private String road;
@SerializedName("right")
@Expose
private List<Right> right = null;
@SerializedName("left")
@Expose
private List<Left> left = null;

public String getRoad() {
return road;
}

public void setRoad(String road) {
this.road = road;
}

public List<Right> getRight() {
return right;
}

public void setRight(List<Right> right) {
this.right = right;
}

public List<Left> getLeft() {
return left;
}

public void setLeft(List<Left> left) {
this.left = left;
}

}

-----------------------------------com.example.Left.java-----------------------------------

 package com.example;

import com.google.gson.annotations.Expose;
import com.google.gson.annotations.SerializedName;

public class Left {

@SerializedName("houseID")
@Expose
private String houseID;
@SerializedName("isPainted")
@Expose
private String isPainted;
@SerializedName("ownerGender")
@Expose
private String ownerGender;

public String getHouseID() {
return houseID;
}

public void setHouseID(String houseID) {
this.houseID = houseID;
}

public String getIsPainted() {
return isPainted;
}

public void setIsPainted(String isPainted) {
this.isPainted = isPainted;
}

public String getOwnerGender() {
return ownerGender;
}

public void setOwnerGender(String ownerGender) {
this.ownerGender = ownerGender;
}

}

-----------------------------------com.example.Mydata.java-----------------------------------

package com.example;

import java.util.List;
import com.google.gson.annotations.Expose;
import com.google.gson.annotations.SerializedName;

public class Mydata {

@SerializedName("totalRoads")
@Expose
private String totalRoads;
@SerializedName("noOfHouse")
@Expose
private String noOfHouse;
@SerializedName("house")
@Expose
private List<House> house = null;

public String getTotalRoads() {
return totalRoads;
}

public void setTotalRoads(String totalRoads) {
this.totalRoads = totalRoads;
}

public String getNoOfHouse() {
return noOfHouse;
}

public void setNoOfHouse(String noOfHouse) {
this.noOfHouse = noOfHouse;
}

public List<House> getHouse() {
return house;
}

public void setHouse(List<House> house) {
this.house = house;
}

}

-----------------------------------com.example.Right.java-----------------------------------

 package com.example;

import com.google.gson.annotations.Expose;
import com.google.gson.annotations.SerializedName;

public class Right {

@SerializedName("houseID")
@Expose
private String houseID;
@SerializedName("isPainted")
@Expose
private String isPainted;
@SerializedName("ownerGender")
@Expose
private String ownerGender;

public String getHouseID() {
return houseID;
}

public void setHouseID(String houseID) {
this.houseID = houseID;
}

public String getIsPainted() {
return isPainted;
}

public void setIsPainted(String isPainted) {
this.isPainted = isPainted;
}

public String getOwnerGender() {
return ownerGender;
}

public void setOwnerGender(String ownerGender) {
this.ownerGender = ownerGender;
}

}

And you can get everything with:

JSONObject jObject = new JSONObject(
            byteArrayOutputStream.toString());
Gson g = new Gson();
Example example = g.fromJson(jObject .toString(), Example.class);

You can get value from Example.

Mydata mydata = example.getMyData();

List<House> lstHouse = mydata.getHouse();
for (i= 0; i < lstHouse.size(); i++){
   House house = lstHouse.get(i);
   String road = house.getRoad();

   List<Right> lstRight = house.getRight();
   for (j= 0; j < lstRight .size(); j++){
      Right right = lstRight.get(j);
      String houseID = right.getHouseID();
      String isPainted = right.getIsPainted();
      String ownerGender = right.getOwnerGender();
   }


   List<Left> lstLeft = house.getLeft();
   for (k= 0; k < lstLeft .size(); k++){
      Left left= lstLeft .get(k);
      String houseID = left.getHouseID();
      String isPainted = left.getIsPainted();
      String ownerGender = left.getOwnerGender();
   }

}

I hope it can help your problem!

3 Comments

In this. How could i get right side house details of road1? like (houseID, isPainted, ownerGender)
can u please help me with this?
I am trying to add these house details in a 2d array. but its quite difficult for me, can u help pls?
1

You're trying to access data from house to houseId, but you have to go through right and left structures previously.

Comments

1

houseID is inside the right array not in house array.

Try this :

    JSONObject jObject = new JSONObject(byteArrayOutputStream.toString());
    JSONObject jObjectResult = jObject.getJSONObject("mydata");
    JSONArray jArray = jObjectResult.getJSONArray("house");

            String house_ID = "";
            boolean is_painted = false;
            String owner_gender = "";
            ArrayList<String[]> data = new ArrayList<String[]>();
            for (int i = 0; i < jArray.length(); i++) {

               JSONObject jsonObj = jArray.getJSONObject(i);
               JSONArray jsonArray = jsonObj.getJSONArray("right");
                for (int j = 0; j < jsonArray.length(); j++) 
                {

                   house_ID = jsonArray.getJSONObject(j).getString("houseID");
                   is_painted = jsonArray.getJSONObject(j).getBoolean("isPainted");
                   owner_gender = jsonArray.getJSONObject(j).getString("ownerGender");
                Log.v("house_ID", house_ID);
                Log.v("is_painted", String.valueOf(is_painted));
                Log.v("owner_gender", owner_gender);
                data.add(new String[] { house_ID, String.valueOf(is_painted), owner_gender });

               }

            }

Comments

1

Here is a solution which is very close to your implementation, however, correct, and will also read the "left" array :)

 InputStream inputStream = getResources().openRawResource(R.raw.sojson);
    ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();

    int ctr;
    try {
        ctr = inputStream.read();
        while (ctr != -1) {
            byteArrayOutputStream.write(ctr);
            ctr = inputStream.read();
        }
        inputStream.close();
    } catch (IOException e) {
        e.printStackTrace();
    }
    Log.v("House Data", byteArrayOutputStream.toString());
    try {
        JSONObject jObject = new JSONObject(
                byteArrayOutputStream.toString());
        JSONObject jObjectResult = jObject.getJSONObject("mydata");
        JSONArray houseArray = jObjectResult.getJSONArray("house");

        String house_ID = "";
        boolean is_painted = false;
        String owner_gender = "";
        ArrayList<String[]> data = new ArrayList<String[]>();

        for (int i = 0; i < houseArray.length(); i++) {

            JSONObject ob = houseArray.getJSONObject(i);

            JSONArray rightArray = ob.getJSONArray("right");

            for (int r = 0; r < rightArray.length(); r++) {
                house_ID = rightArray.getJSONObject(r).getString("houseID");
                is_painted = rightArray.getJSONObject(r).getBoolean("isPainted");
                owner_gender = rightArray.getJSONObject(r).getString("ownerGender");
                Log.v("house_ID", house_ID);
                Log.v("is_painted", String.valueOf(is_painted));
                Log.v("owner_gender", owner_gender);
                data.add(new String[]{house_ID, String.valueOf(is_painted), owner_gender});
            }

            JSONArray leftArray = ob.getJSONArray("left");

            for (int l = 0; l < leftArray.length(); l++) {
                house_ID = leftArray.getJSONObject(l).getString("houseID");
                is_painted = leftArray.getJSONObject(l).getBoolean("isPainted");
                owner_gender = leftArray.getJSONObject(l).getString("ownerGender");
                Log.v("house_ID", house_ID);
                Log.v("is_painted", String.valueOf(is_painted));
                Log.v("owner_gender", owner_gender);
                data.add(new String[]{house_ID, String.valueOf(is_painted), owner_gender});
            }
        }
    } catch (Exception e) {
        e.printStackTrace();
    }

Be sure to use valid JSON:

    {  
   "mydata":{  
      "totalRoads":"13",
      "noOfHouse":"5",
      "house":[  
         {  
            "road":"1",
            "right":[  
               {  
                  "houseID":"A3",
                  "isPainted":"false",
                  "ownerGender":"female"
               },
               {  
                  "houseID":"A4",
                  "isPainted":"true",
                  "ownerGender":"female"
               }
            ],
            "left":[  
               {  
                  "houseID":"A1",
                  "isPainted":"false",
                  "ownerGender":"female"
               },
               {  
                  "houseID":"A2",
                  "isPainted":"false",
                  "ownerGender":"female"
               }
            ]
         },
         {  
            "road":"2",
            "right":[  
               {  
                  "houseID":"B3",
                  "isPainted":"false",
                  "ownerGender":"male"
               },
               {  
                  "houseID":"B4",
                  "isPainted":"true",
                  "ownerGender":"male"
               }
            ],
            "left":[  
               {  
                  "houseID":"B1",
                  "isPainted":"true",
                  "ownerGender":"male"
               },
               {  
                  "houseID":"B2",
                  "isPainted":"true",
                  "ownerGender":"male"
               }
            ]
         },
         {  
            "road":"3",
            "right":[  
               {  
                  "houseID":"C3",
                  "isPainted":"false",
                  "ownerGender":"male"
               },
               {  
                  "houseID":"C4",
                  "isPainted":"false",
                  "ownerGender":"male"
               }
            ],
            "left":[  
               {  
                  "houseID":"C1",
                  "isPainted":"true",
                  "ownerGender":"male"
               },
               {  
                  "houseID":"C2",
                  "isPainted":"false",
                  "ownerGender":"male"
               }
            ]
         }
      ]
   }
}

Comments

1

house_ID = jArray.getJSONObject(i).getString("houseID"); // WRONG WAY

I guess JSONException will occur.

You should create two FOR loop.

 for (int i = 0; i < jArray.length(); i++) 
 {
    JSONObject _jOBJ = jArray.getJSONObject(i);
    JSONArray jsonArray = _jOBJ.getJSONArray("right");
       for (int j = 0; j < jsonArray.length(); j++) 
       {
       JSONObject _jOBJCHILD = jsonArray.getJSONObject(j);
       String str_HOUSEID = _jOBJCHILD.getString("houseID");

       }
 }

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.