joh*_*ohn 7 java string json 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
}
Run Code Online (Sandbox Code Playgroud)
例如,一个键是"u"
,它的值是 -
{
"string":"1235"
}
Run Code Online (Sandbox Code Playgroud)
同样,另一个键是"country_id"
,它的值是 -
{
"int":3
}
Run Code Online (Sandbox Code Playgroud)
现在我需要做的是,我需要表示如下所示的键值对。如果任何值是字符串数据类型(如 keyu
的值),则用双引号表示它的值,否则不要用双引号表示它的值。country_id 的含义值不会在 String 双引号中,因为它是一个 int。
"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
Run Code Online (Sandbox Code Playgroud)
然后我需要制作另一个 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
}
Run Code Online (Sandbox Code Playgroud)
所以我开始了我的方法,并提供了以下代码 -
String response = "original_json_string";
Type type = new TypeToken<Map<String, Object>>() {}.getType();
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);
String json = gson.toJson(jsonOut);
System.out.println(json);
}
}
Run Code Online (Sandbox Code Playgroud)
上面的代码工作正常。唯一不起作用的是 - 当我尝试将 jsonOut 映射序列化为 JSON 时,某些键值未正确显示。例如country_id
,timestamp
这两个键值是错误的。
所以现在我的 json 是这样打印的 - 你可以看到,值country_id
是 3.0 而应该是 3。同样的值timestamp
是 1.417823759555E12 而应该是 1417823759555
{
"u": "1235",
"p": "2047935",
"client_id": "5",
"origin":null,
"item_condition":null,
"country_id": 3.0, // this is different value
"timestamp": 1.417823759555E12, // and this is different value
"impression_id": "2345HH*",
"is_consumerid": true,
"is_pid": false
}
Run Code Online (Sandbox Code Playgroud)
所以 ny new 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
}
Run Code Online (Sandbox Code Playgroud)
我该怎么做,我做错了什么?
默认情况下,Gson 用于Double
映射任何 JSON 数字。由于您没有明确说明 Java 映射(即您使用过Object
)
Type type = new TypeToken<Map<String, Object>>() {}.getType();
Run Code Online (Sandbox Code Playgroud)
Gson 将使用其默认值。
除非您指定确切的类型(这在您的情况下似乎很困难,因为您的 JSON 似乎是动态的),否则您需要在将其添加到最终的序列化集合之前自行进行转换。
归档时间: |
|
查看次数: |
7829 次 |
最近记录: |