GSON。如何将json对象转换为json数组?

时间:2016-01-29 11:38:56

标签: java android json parsing gson

现在我从API获取此JSON:

{"supplyPrice": {
        "CAD": 78,
        "CHF": 54600.78,
        "USD": 20735.52
      }}

但价格是动态的,这就是我需要这种形式的JSON的原因

{
  "supplyPrice": [
    {
      "name": "CAD",
      "value": "78"
    },
    {
      "name": "TRY",
      "value": "34961.94"
    },
    {
      "name": "CHF",
      "value": "54600.78"
    },
    {
      "name": "USD",
      "value": "20735.52"
    }
  ]
}

如何使用GSON执行此操作?

7 个答案:

答案 0 :(得分:2)

您需要迭代supplyPrice对象的所有键,并使用该键值创建New JSONArray,然后将新数组分配给supplyPrice键

JSONObject changeSupplyPrice(JSONObject JSONObj){
    try {
        JSONObject supplyPrice =JSONObj.getJSONObject("supplyPrice");
        JSONArray supplyPriceArray = new JSONArray();
        Iterator<?> keys = supplyPrice.keys();

        while( keys.hasNext() ) {
            String key = (String)keys.next();
            Log.e("JSON Array key",key);
            supplyPriceArray.put(new JSONObject("{"+key+":"+supplyPrice.getString(key)+"}"));

        }
        JSONObj.put("supplyPrice", supplyPriceArray);
        return JSONObj;
    } catch (JSONException e) {
        e.printStackTrace();
    }
    return null;
}

然后调用你想要的功能

try {
        JSONObject JSONObj = new JSONObject("{'taxes': [],'name': 'Laboriosam iusto eum','requiresShipping': false,  'taxable': true,  'sku': 'QBA84J18832',  'product': 12, 'supplyPrice': {    'CAD': 78,   'CHF': 54600.78,    'USD': 20735.52  }}");
        JSONObj = changeSupplyPrice(JSONObj);
        Log.e("Return JSON Object",JSONObj.toString());
    } catch (JSONException e) {
        e.printStackTrace();
    }

答案 1 :(得分:2)

希望这部分代码可以帮助您:

    String json = "{\"supplyPrice\": {\n" +
            "        \"CAD\": 78,\n" +
            "        \"CHF\": 54600.78,\n" +
            "        \"USD\": 20735.52\n" +
            "      }}";

    Gson gson = new Gson();
    JsonObject jsonObject = gson.fromJson(json, JsonObject.class);
    JsonObject supplyPrice = jsonObject.get("supplyPrice").getAsJsonObject();
    Type type = new TypeToken<HashMap<String, Double>>() {
    }.getType();
    HashMap<String, Double> parsedJson = gson.fromJson(supplyPrice, type);
    JsonArray jsonArray = new JsonArray();
    for(String key : parsedJson.keySet()) {
        JsonObject jo = new JsonObject();
        jo.addProperty("name", key);
        jo.addProperty("value", parsedJson.get(key));
        jsonArray.add(jo);
    }
    JsonObject result = new JsonObject();
    result.add("supplyPrice", jsonArray.getAsJsonArray());

答案 2 :(得分:1)

GSON使用POJO类将JSON解析为java对象。

创建一个包含变量的java类,其名称和数据类型与JSON对象的键相同。我认为你得到的JSON格式不正确。

Class SupplyPrice{
 double CAD;
 double CHF;
 double TRY
}

Class SupplyPriceContainer{
 ArrayList<SupplyPrice> supplyPrice;
}

你的JSON应该是

 {
    "CAD": 78,
    "CHF": 54600.78,
    "USD": 20735.52
 }



{
    "supplyPrice": [{
        "CAD": 78,
        "CHF": 0,
        "USD": 0
    }, {
        "CAD": 0,
        "CHF": 54600.00,
        "USD": 0
    }, {
        "CAD": 0,
        "CHF": 0,
        "USD": 20735.52
    }]
 }

然后你可以使用GSON的`fromJson(String pJson,Class pClassType)转换为JAVA对象

  Gson gson = new Gson()
  ArrayList<SupplyPrice> suplyPrices = gson.fromJson(pJsonString, SupplyPrice.class);

现在您可以使用arraylist获取数据。

答案 3 :(得分:0)

您可以直接将其转换为HashMap or TreeMap,然后在地图中导航所有按键。

这是实现目标的最简单方法。

答案 4 :(得分:0)

一旦看到这个......可能对你有帮助。

 JSONObject json= json.getJSONObject("supplyPrice");
    Iterator i = json.keys();
    JSONArray jsonArray = new JSONArray();

    while (i.hasNext()){
        String key = (String) i.next();
        jsonArray.put(json.get(key));

答案 5 :(得分:0)

感谢Rohit Patil!我修改了他的代码以适应我的情况而且有效!

private JSONObject modifyPrices(JSONObject JSONObj) {
    try {
        JSONObject supplyPrice = JSONObj.getJSONObject("supplyPrice");
        JSONArray supplyPriceArray = new JSONArray();
        Iterator<?> keys = supplyPrice.keys();
        while (keys.hasNext()) {
            String key = (String) keys.next();
            String value = supplyPrice.getString(key);
            supplyPriceArray.put(new JSONObject("{\"name\":" + key + ",\"value\":" + value + "}"));
        }
        JSONObj.put("supplyPrice", supplyPriceArray);
        return JSONObj;
    } catch (JSONException e) {
        e.printStackTrace();
    }
    return null;
}

答案 6 :(得分:0)

我们仅需一行代码即可将jsonObjects转换为数组(不是jsonArrays,但将其设置为arrayList之后,您也可以轻松创建jsonArray。)

moment(timestamp).format('hh:ss dd.MM.YY');