循环嵌套的ArrayList从JSON使用GSON显示值 [英] Looping nested ArrayList to display values from JSON using gson

查看:126
本文介绍了循环嵌套的ArrayList从JSON使用GSON显示值的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

问:我有JSON那些在嵌套元素的形式价值,正如你可以看到下面我有值从服务器的阵列内部,比里面有它第二个数组。现在我用GSON解析这个值,每一件事情是工作了,直到orderDetailList但是当我尝试循环扔subItemPart我无法检索值subItemPart对象。

Q: I have json that have values in form of nested element, As you can see below i have values from server inside the array and than there is second array inside it. Now i using gson to parse this values, Every thing is working up-until "orderDetailList" but when i try to loop throw "subItemPart" I'm unable to retrieve values of subItemPart object.

来源$ C ​​$ C:

Source Code:

输入JSON字符串文件myFile.json(验证使用JSONLint:有效的JSON)

Input JSON String in file myFile.json (Validated using JSONLint: Valid JSON)

{
  "customerId": "CUST01",
  "orderId": "101010",
  "orderTotal": 99.99,
  "orderDetailList": [
    {
      "lineId": "1",
      "itemNumber": "ABC",
      "quantity": 9,
      "price": 10.0,
      "subItemPart":[{"itemName":"RAM", "quantity": 5}, {"itemName":"LED", "quantity": 3}]
    },
    {
      "lineId": "2",
      "itemNumber": "XYZ",
      "quantity": 1,
      "price": 9.99 ,
      "subItemPart":[{"itemName":"RAM", "quantity": 5}, {"itemName":"LED", "quantity": 3}]
    }
  ]
}

Java源代码code转换一个JSON字符串到Java对象

Java source code for converting a JSON String to Java Object

package com.as400samplecode;

import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;
import java.util.ArrayList;

import com.as400samplecode.util.OrderDetail;
import com.as400samplecode.util.OrderHeader;
import com.google.gson.Gson;

public class ParseJSON {

 public static void main(String[] args) {

  String myJSONString = "";
  BufferedReader bufferedReader = null;

  try {

   String sCurrentLine;

   bufferedReader = new BufferedReader(new FileReader("data/myFile.json"));

   while ((sCurrentLine = bufferedReader.readLine()) != null) {
    myJSONString = myJSONString + sCurrentLine;
   }

  } catch (IOException e) {
   e.printStackTrace();
  } finally {
   try {
    if (bufferedReader != null){
     bufferedReader.close();
    }
   } catch (IOException ex) {
    ex.printStackTrace();
   }
  }

  Gson gson = new Gson();
  OrderHeader orderHeader = gson.fromJson(myJSONString, OrderHeader.class);

  System.out.println("Order Information --->");
  System.out.println("Customer Id: " + orderHeader.getCustomerId());
  System.out.println("Order Id: " + orderHeader.getOrderId());
  System.out.println("Order Total: " + orderHeader.getOrderTotal());

  ArrayList<OrderDetail> orderDetailList = orderHeader.getOrderDetailList();
  for (int i=0; i<orderDetailList.size(); i++){
   System.out.println("Order Detail --->");
   OrderDetail orderDetail = orderDetailList.get(i);
   System.out.println("Line Id: " + orderDetail.getLineId());
   System.out.println("Item Number: " + orderDetail.getItemNumber());
   System.out.println("Quantity: " + orderDetail.getQuantity());
   System.out.println("Price: " + orderDetail.getPrice());

   **//HOW CAN I HERE LOOP AND DISPLAY VALUES OF SubOrderItem?**
   //I GET error when i do: System.out.println("SubItem: " +orderDetail.getSubOrderDetail.itemName);

  }

 }


}

Java源代码code为OrderHeader对象

Java source code for OrderHeader Object

package com.as400samplecode.util;

import java.util.ArrayList;

public class OrderHeader {

 String customerId = null;
 String orderId = null;
 Double orderTotal = null;
 ArrayList<OrderDetail> orderDetailList;

 public String getCustomerId() {
  return customerId;
 }
 public void setCustomerId(String customerId) {
  this.customerId = customerId;
 }
 public String getOrderId() {
  return orderId;
 }
 public void setOrderId(String orderId) {
  this.orderId = orderId;
 }
 public Double getOrderTotal() {
  return orderTotal;
 }
 public void setOrderTotal(Double orderTotal) {
  this.orderTotal = orderTotal;
 }
 public ArrayList<OrderDetail> getOrderDetailList() {
  return orderDetailList;
 }
 public void setOrderDetailList(ArrayList<OrderDetail> orderDetailList) {
  this.orderDetailList = orderDetailList;
 }

}

Java源代码code代表的OrderDetail对象

Java source code for OrderDetail Object

package com.as400samplecode.util;

public class OrderDetail {

 String lineId = null;
 String itemNumber = null;
 int quantity = 0;
 Double price = null;
 ArrayList<SubOrderItemDetail> subItemPart;


 public String getLineId() {
  return lineId;
 }
 public void setLineId(String lineId) {
  this.lineId = lineId;
 }
 public String getItemNumber() {
  return itemNumber;
 }
 public void setItemNumber(String itemNumber) {
  this.itemNumber = itemNumber;
 }
 public int getQuantity() {
  return quantity;
 }
 public void setQuantity(int quantity) {
  this.quantity = quantity;
 }
 public Double getPrice() {
  return price;
 }
 public void setPrice(Double price) {
  this.price = price;
 }
 public ArrayList<SubItemDetail> getSubOrderDetail() {
  return subItemPart;
 }
 public void setSubOrderDetail(ArrayList<SubItemDetail> subItemPart) {
  this.subItemPart = subItemPart;
 }


}

//我的问题是我如何获得这个元素的值,因为它们是JSON嵌套数组值
Java源代码code为SubItemPart对象

//My question is How do i get values of this element, Since they are values of json nested arrays Java source code for SubItemPart Object

package com.as400samplecode.util;

public class SubOrderDetail {

 String itemName = null;
 int quantity = 0;


 public String getLineId() {
  return itemName;
 }
 public void setLineId(String itemName) {
  this.itemName = itemName;
 }
 public int getItemNumber() {
  return quantity;
 }
 public void setItemNumber(int quantity) {
  this.quantity = quantity;
 }

}

感谢。

推荐答案

好了,首先你必须与你的类名有点乱。因为在你的类的OrderDetail 您有:

Well, first of all you have a little mess with your class names. Because in your class OrderDetail you have:

ArrayList<SubOrderItemDetail> subItemPart;

//...

public ArrayList<SubItemDetail> getSubOrderDetail() {
  return subItemPart;
}
public void setSubOrderDetail(ArrayList<SubItemDetail> subItemPart) {
  this.subItemPart = subItemPart;
}

和那么你的其他类是:

public class SubOrderDetail {

所以...你意识到你必须为同一类(3不同的名字即 SubOrderItemDetail SubItemDetail SubOrderDetail )?

这是说,如果你的名字解决问题,你的code是工作,而你只有一个很简单的问题,显示它。为了显示一个子列表内的你可以添加此code,你有你的注释行:

That said, if you fix the problem with the names, your code is working, and you only have a very simple problem with displaying it. In order to display a sub-list inside a for you can just add this code where you have your commented lines:

ArrayList<SubOrderItemDetail> subOrderDetailList = orderDetail.getSubOrderDetail();
for (int j = 0; j < orderDetailList.size(); j++) {
  System.out.println("Sub Order Detail --->");
  SubOrderItemDetail subOrderDetail = subOrderDetailList.get(j);
  System.out.println("Line Id: " + subOrderDetail.getLineId());
  System.out.println("Item Number: " + subOrderDetail.getItemNumber());
}

请注意,在code我已经写了,我按照你的previous code中的风格,但我preFER是这样的:

Note that in the code I've written I'm following the style in your previous code, but I prefer this way:

for (SubOrderItemDetail soid : orderDetail.getSubOrderDetail()) {
  System.out.println("Line Id: " + soid.getLineId());
  System.out.println("Item Number: " + soid.getItemNumber());
}

您也可以按照这种风格在你的previous 和你的code将会更加干净...

You can also follow this style in your previous for and your code will be much cleaner...

这篇关于循环嵌套的ArrayList从JSON使用GSON显示值的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆