2017-04-26 47 views
1

我有一个JSONArray,我可以解析,但由于数组的结构,我无法映射从具有相同名称的字段中提取的值。而不是for循环分配一个接一个的值,分配查看字段名称的最后一个实例。所以来自第二个JSONObject的值被分配两次。在Android中使用相同字段名称的JSONArray解析和值映射

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

回答

1

你越来越阵列(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"); 
+0

当我尝试这一点,我fragment.getActivity线程不能访问收到的字符串。有没有办法来解决这个问题? –

+0

啊谢谢你!我简单地把runOnUiThread放在(if == 0)和(if == 1)里面,它工作正常。 –

1

创建getter和setter您JSONArray键的一类。 使用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); 
      } 
     } 

参与者是类名称。 使用适配器类在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 
} 

}

相关问题