如何以预定义格式表示JSON字符串中的键值?

时间:2014-12-06 01:21:37

标签: java json string gson

我有一个像这样的JSON字符串,其中我有键和值,如下所示 -

{
  "u":{
     "string":"1235"
  },
  "p":"2047935",
  "client_id":{
     "string":"5"
  },
  "origin":null,
  "item_condition":null,
  "country_id":{
     "int":3
  },
  "timestamp":{
     "long":1417823759555
  },
  "impression_id":{
     "string":"2345HH*"
  },
  "is_consumerid":true,
  "is_pid":false
}

例如,一个键是"u",其值是 -

{
    "string":"1235"
}

同样,另一个键是"country_id",其值为 -

{
    "int":3
}

同样适用于其他人。现在我需要做的是,我需要表示上面的键值,如下所示。如果任何值是字符串数据类型,则用双引号表示,否则不要用双引号表示

"u": "1235"
"p": "2047935"
"client_id": "5"
"origin":null
"item_condition":null   
"country_id": 3 // I don't have double quotes here around 3 since country_id was int that's why
"timestamp": 1417823759555
"impression_id": "2345HH*"
"is_consumerid": true
"is_pid": false

然后我需要制作另一个看起来像这样的json字符串 -

{
    "u": "1235",
    "p": "2047935",
    "client_id": "5",
    "origin":null,
    "item_condition":null,      
    "country_id": 3,
    "timestamp": 1417823759555,
    "impression_id": "2345HH*",
    "is_consumerid": true,
    "is_pid": false
}

最好和最有效的方法是什么?

更新: -

这就是我所拥有的 -

    JsonObject jsonObject = new JsonParser().parse(response).getAsJsonObject();

    for (Map.Entry<String, JsonElement> object : jsonObject.entrySet()) {
        if (object.getValue() instanceof JsonObject) {
            String data = object.getValue().toString();
            Map<String, Object> jsonIn = gson.fromJson(data, type);
            Map<String, Object> jsonOut = new HashMap<String, Object>();

            Set<String> keys = jsonIn.keySet();
            for (String key : keys) {
                Object value = jsonIn.get(key);
                if (value instanceof Map) {
                    Map<?, ?> mapValue = (Map<?, ?>) value;
                    for (Map.Entry<?, ?> entry : mapValue.entrySet()) {
                        jsonOut.put(key, entry.getValue());
                    }
                } else {
                    jsonOut.put(key, value);
                }
            }

            // System.out.println(jsonOut);
            Type typeOfMap = new TypeToken<Map<String, String>>() {
            }.getType();
            String json = gson.toJson(jsonOut, typeOfMap);
            System.out.println(json);

        }
    }

只有不起作用的是 - 当我尝试将jsonOut映射序列化为JSON时,特定键的所有值都会转换为字符串。但我需要的是,只有这些值应该转换为一个字符串(双引号),它们通常像country_id值不应该是双引号,因为它是一个整数,按照我原来的JSON。

1 个答案:

答案 0 :(得分:1)

伪代码:

Map<Object> jsonIn = JsonParser.parseJsonToMap(theJson);
Map<Object> jsonOut = new HashMap<Object>();
String[] keys = jsonIn.getKeys();
for (String key in keys) {
    Object value = jsonIn.get(key);
    if (value instanceof Map) {
        Map mapValue = (Map) value;
        Object[] valueValues = mapValue.getValues();
        assert valueValues.length == 1;
        jsonOut.add(key, valueValues[0]);
    }
    else {
        jsonOut.add(key, value);
    }
}

这段代码依赖于一个人不应该操纵数据类型的事实而作弊,因为它们已经是正确的。可以添加更多逻辑来检查内部地图的关键值以确定数据类型,但我认为没有意义,除非需要某种数据类型转换。

一些JSON工具包有自己的类,比如JSONObject,它们使用的是代替Maps,但它们基本上只是Map的子类,逻辑是相同的(尽管instanceof会被替换通过查询值的类型,(Map)强制转换将被特定的getObject方法调用替换为等等。