【问题标题】:JSONArray Parsing and Value Mapping with Same Field Names in AndroidAndroid中具有相同字段名称的JSONArray解析和值映射
【发布时间】:2017-04-26 16:25:13
【问题描述】:

我有一个可以解析的 JSONArray,但由于数组的结构,我在映射从具有相同名称的字段中提取的值时遇到了困难。不是 for 循环一个接一个地赋值,而是查看字段名称的最后一个实例。所以第二个 JSONObject 的值被分配了两次。

"Group": [
    {
      "-Type": "Mouldings",
      "CurTier": "BRZ",
      "NxtTier": "SIL",
      "CurTierFrom": "$4,000",
      "CurTierTo": "$9,999",
      "NxtTierFrom": "$10,000",
      "NxtTierTo": "$14,999",
      "CurSales": "$2,107",
      "ReqSales": "$7,893"
    },
    {
      "-Type": "Accessories",
      "CurTier": "BAS",
      "NxtTier": "GLD",
      "CurTierFrom": "$0",
      "CurTierTo": "$1,499",
      "NxtTierFrom": "$1,500",
      "NxtTierTo": "$4,999",
      "CurSales": "$693",
      "ReqSales": "$807"
    }
  ]

代码:

try {
                JSONObject reader = new JSONObject(JSON_DATA);

                JSONObject PricingTier = reader.getJSONObject("PricingTier");

                JSONArray Group = PricingTier.getJSONArray("Group");

                for (int i = 0; i < Group.length(); i++) {
                    JSONObject g = Group.getJSONObject(i);


                    final String Type = g.getString("@Type");
                    final String CurTier = g.getString("CurTier");
                    final String NxtTier = g.getString("NxtTier");
                    final String CurTierFrom = g.getString("CurTierFrom");
                    final String CurTierTo = g.getString("CurTierTo");
                    final String NxtTierFrom = g.getString("NxtTierFrom");
                    final String NxtTierTo = g.getString("NxtTierTo");
                    final String CurSales = g.getString("CurSales");
                    final String ReqSales = g.getString("ReqSales");
                    final String TypeA = g.getString("@Type");
                    final String CurTierA = g.getString("CurTier");
                    final String NxtTierA = g.getString("NxtTier");
                    final String CurTierFromA = g.getString("CurTierFrom");
                    final String CurTierToA = g.getString("CurTierTo");
                    final String NxtTierFromA = g.getString("NxtTierFrom");
                    final String NxtTierToA = g.getString("NxtTierTo");
                    final String CurSalesA = g.getString("CurSales");
                    final String ReqSalesA = g.getString("ReqSales");

                    fragment.getActivity().runOnUiThread(new Runnable() {
                        @Override
                        public void run() {

                            tvType.setText(Type);
                            tvCurTier.setText(CurTier);
                            tvNxtTier.setText(NxtTier);
                            tvCurTierFrom.setText(CurTierFrom);
                            tvCurTierTo.setText(CurTierTo);
                            tvNxtTierFrom.setText(NxtTierFrom);
                            tvNxtTierTo.setText(NxtTierTo);
                            tvCurSales.setText(CurSales);
                            tvReqSales.setText(ReqSales);
                            tvTypeA.setText(TypeA);
                            tvCurTierA.setText(CurTierA);
                            tvNxtTierA.setText(NxtTierA);
                            tvCurTierFromA.setText(CurTierFromA);
                            tvCurTierToA.setText(CurTierToA);
                            tvNxtTierFromA.setText(NxtTierFromA);
                            tvNxtTierToA.setText(NxtTierToA);
                            tvCurSalesA.setText(CurSalesA);
                            tvReqSalesA.setText(ReqSalesA);
                        }
                    });
                }

结果:

"-Type": "Accessories",
  "CurTier": "BAS",
  "NxtTier": "GLD",
  "CurTierFrom": "$0",
  "CurTierTo": "$1,499",
  "NxtTierFrom": "$1,500",
  "NxtTierTo": "$4,999",
  "CurSales": "$693",
  "ReqSales": "$807"
"-Type": "Accessories",
  "CurTier": "BAS",
  "NxtTier": "GLD",
  "CurTierFrom": "$0",
  "CurTierTo": "$1,499",
  "NxtTierFrom": "$1,500",
  "NxtTierTo": "$4,999",
  "CurSales": "$693",
  "ReqSales": "$807"

【问题讨论】:

    标签: android arrays json textview


    【解决方案1】:

    你得到 array(i = 0) 并写入所有 18 个变量,然后取值 1 并覆盖相同的 18 个变量。

    您必须将此变量与循环中的相同变量分开。例如:当 Group.getObj(i = 0).

    final String Type = g.getString("@Type");
    

    然后当 Group.getObj(i = 1):

    final String TypeA = g.getString("@Type");
    

    【讨论】:

    • 当我尝试这个时,我的 fragment.getActivity 线程无法访问收到的字符串。有没有办法解决这个问题?
    • 啊,谢谢!我只是将 runOnUiThread 放在 (if == 0) 和 (if == 1) 内,它工作正常。
    【解决方案2】:

    为您的 JSONArray 键创建一个带有 getter 和 setter 的类。 使用 for 循环读取值,参考代码。

                for (int i = 0; i < Group.length(); i++) {
                    JSONObject g = Group.getJSONObject(i);
                    Actors actors = new Actors();
                    actors.setType(g.getString("@Type"));
                    ......//your remaining code
                    arrayList.add(actors);
                }
            }
    

    Actors 是类名。 使用适配器类在 ListView 中显示列表。

    public class yourAdapter extends ArrayAdapter<Actors> {
    
    LayoutInflater vi;
    ViewHolder holder;
    int resource;
    private final Activity context;
    private final ArrayList<Actors> details;
    
    public WifiAdapter(Activity context, int resource , ArrayList<Actors> details) {
        super(context, resource, details);
        vi =  (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        this.context = context;
        this.resource = resource;
        this.details = details;
    }
    
    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        View v = convertView;
        if(v == null){
            holder = new ViewHolder();
            v = vi.inflate(resource, null);
            holder.Type = (TextView) v.findViewById(R.id.type);
            .......//your remaining code
            v.setTag(holder);
        }
        else {
            holder =(ViewHolder) v.getTag();
        }
    
    
        holder.Name.setText(details.get(position).getType());
        ..........//ur remaining code 
    
    
        return v;
    }
    
    static class ViewHolder {
        public TextView Type;
        //your remaing code
    }
    

    }

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-12-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多