JSON Анализ данных из двухмерного массива

Мне нужно получить данные из массива house, мой файл 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"
      }
    ]
  }
]
}
}

Я только что попытался разобрать данные из 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();
    }

Но я не смог получить то, что ожидаю, пожалуйста, помогите мне получить все данные из json.


person ChyperX    schedule 24.10.2017    source источник
comment
Json недействителен.   -  person IntelliJ Amiya    schedule 24.10.2017
comment
@IntelliJAmiya Не могли бы вы пояснить, почему это недействительно?   -  person ChyperX    schedule 24.10.2017
comment
попробуйте здесь jsonviewer.stack.hu   -  person IntelliJ Amiya    schedule 24.10.2017
comment
спасибо .. Я скопировал небольшую часть своих данных.   -  person ChyperX    schedule 24.10.2017
comment
houseID находится внутри правого массива, а не в массиве домов. может быть, вы забыли эту строку.   -  person Vidhi Dave    schedule 24.10.2017
comment
jArray.getJSONArray(справа) вы забыли.   -  person Vidhi Dave    schedule 24.10.2017
comment
@user8595331 user8595331 проверь мой ответ. надеюсь, это решит вашу проблему   -  person Vidhi Dave    schedule 24.10.2017


Ответы (8)


Вы можете использовать Gson lib для простого получения данных из Json, и ваша структура будет такой:

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 + '\'' + 
            "}";
        }
}
person Krutik    schedule 24.10.2017

Привет, твой 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"
        }
      ]
    }
    ]
}
}


  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();
    }
person Shanmugam    schedule 24.10.2017
comment
это правильно, скопируйте и вставьте в любой онлайн-редактор json, а также houseId находится внутри еще одного массива - person Shanmugam; 24.10.2017
comment
Скопировано из моих больших данных. Вот почему некоторые теги пропущены - person ChyperX; 24.10.2017
comment
я также добавил синтаксический анализ, проверьте это - person Shanmugam; 24.10.2017

1- Создайте модель для houseData, т.е.

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

2- Анализ данных справа и слева от каждого объекта дома

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 Добавьте его в ArrayList вашего houseEntity.

Кроме того, вы можете использовать Gson для преобразования json в объект. Вам не нужно вручную анализировать данные из json.

person Mr.India    schedule 24.10.2017

Вы можете создать объект из своей строки json с помощью

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;
}

}

И вы можете получить все с:

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

Вы можете получить значение из Примера.

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();
   }

}

Я надеюсь, что это может помочь вашей проблеме!

person Thientvse    schedule 24.10.2017
comment
В этом. Как я могу получить информацию о доме справа от дороги 1? нравится (houseID, isPainted, ownerGender) - person ChyperX; 24.10.2017
comment
не могли бы вы помочь мне с этим? - person ChyperX; 25.10.2017
comment
Я пытаюсь добавить эти детали дома в массив 2d. но это довольно сложно для меня, вы можете помочь, пожалуйста? - person ChyperX; 25.10.2017

Вы пытаетесь получить доступ к данным от house до houseId, но предварительно вам нужно пройти через структуры right и left.

person bra_racing    schedule 24.10.2017

houseID находится внутри правого массива, а не в массиве домов.

Попробуйте это:

    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 });

               }

            }
person Vidhi Dave    schedule 24.10.2017

Вот решение, которое очень близко к вашей реализации, однако правильное, и также будет читать "левый" массив :)

 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();
    }

Обязательно используйте действительный 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"
               }
            ]
         }
      ]
   }
}
person burntsugar    schedule 24.10.2017

house_ID = jArray.getJSONObject(i).getString("houseID"); // НЕПРАВИЛЬНЫЙ ПУТЬ

Я предполагаю, что произойдет JSONException.

Вы должны создать два 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");

       }
 }
person IntelliJ Amiya    schedule 24.10.2017