【问题标题】:JSON Parsing data from 2 dimension arrayJSON解析二维数组中的数据
【发布时间】:2017-10-24 06:44:18
【问题描述】:

我需要从 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 中获取所有数据。

【问题讨论】:

  • Json 无效。
  • @IntelliJAmiya 你能详细说明为什么它无效吗?
  • 在这里品尝jsonviewer.stack.hu
  • 谢谢.. 我从我的数据中复制了一小部分。
  • houseID 在正确的数组中而不是在房子数组中。可能是你忘记了那行。

标签: android arrays json jsonparser


【解决方案1】:

您可以使用 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 + '\'' + 
            "}";
        }
}

【讨论】:

    【解决方案2】:

    您好,您的 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();
        }
    

    【讨论】:

    • 这是正确的,在任何在线 json 编辑器中复制和粘贴,并且 houseId 在另一个数组中
    • 复制自我的大数据。这就是为什么有些标签错过了
    • 我也添加了解析,检查一下
    【解决方案3】:

    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 将它添加到你的 houseEntity 的 ArrayList 中。

    另外,您可以使用Gson 进行 json 到对象的转换。 您不必手动解析来自 json 的数据。

    【讨论】:

      【解决方案4】:

      您可以使用

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

      希望对你的问题有所帮助!

      【讨论】:

      • 在这。我怎样才能获得道路 1 的右侧房屋详细信息?喜欢(houseIDisPaintedownerGender
      • 你能帮我解决这个问题吗?
      • 我正在尝试将这些房屋细节添加到二维数组中。但这对我来说很难,你能帮忙吗?
      【解决方案5】:

      您正在尝试访问从househouseId 的数据,但您必须先通过rightleft 结构。

      【讨论】:

        【解决方案6】:

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

        【讨论】:

          【解决方案7】:

          这是一个非常接近您的实现的解决方案,但是,它是正确的,并且还将读取“左”数组:)

           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"
                         }
                      ]
                   }
                ]
             }
          }
          

          【讨论】:

            【解决方案8】:

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

            【讨论】:

              猜你喜欢
              • 2011-01-30
              • 2020-01-14
              • 2014-08-02
              • 2020-01-26
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多