java-如何通过保留键的数据类型将json序列化为另一个json?
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了java-如何通过保留键的数据类型将json序列化为另一个json?,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含3500字,纯文字阅读大概需要6分钟。
内容图文
![java-如何通过保留键的数据类型将json序列化为另一个json?](/upload/InfoBanner/zyjiaocheng/693/a7615e9b40594d679df14306621f32ed.jpg)
我有这样的原始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的值),则用双引号表示它的值,否则不要用双引号表示它的值. country_id的含义值将是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
然后我需要制作另一个看起来像这样的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
}
因此,我从下面的代码开始,但无法理解该怎么做?
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();
// now not sure what should I do here?
}
}
并且我的新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
}
实现此目标的最佳方法是什么?
解决方法:
请注意,我对Gson的经验还不是很丰富,因此可能有最简单的方法来做.在我们之前的讨论之后,也会提出此解决方案.
基本上,问题是要在json文件中获取所需的类型(由addEntry方法完成),并且每个@event键都应具有自己的JSON字符串(由computeJson完成).由于只有两个嵌套级别,因此可以这样做.否则,将采用递归方法.
因此,如果只有一个嵌套级别,则应该迭代其他JsonObject的条目.对于每个条目,computeJson将在列表中添加一个与每个@event键相对应的新Json条目.
public class Test {
public static void main(String[] args) throws Exception {
List<String> output = new ArrayList<>();
JsonObject jsonObject = new JsonParser().parse(new FileReader("myJson.json")).getAsJsonObject();
for (Map.Entry<String, JsonElement> object : jsonObject.entrySet()) {
if (object.getValue() instanceof JsonObject) {
output.add(computeJson((JsonObject)object.getValue()));
}
}
System.out.println(output);
}
private static String computeJson(JsonObject source) {
JsonObject output = new JsonObject();
for (Map.Entry<String, JsonElement> object : source.entrySet()) {
if (object.getValue() instanceof JsonObject) {
for(Map.Entry<String, JsonElement> entry : ((JsonObject)object.getValue()).entrySet()) {
addEntry(object.getKey(), output, entry);
}
} else {
addEntry(object.getKey(), output, object);
}
}
Gson gson = new GsonBuilder().serializeNulls().setPrettyPrinting().create();
return gson.toJson(output);
}
private static void addEntry(String key, JsonObject output, Map.Entry<String, JsonElement> object) {
switch(object.getKey().toLowerCase()) {
case "string":
output.addProperty(key, object.getValue().getAsString());
break;
case "int":
output.addProperty(key, object.getValue().getAsInt());
break;
case "long":
output.addProperty(key, object.getValue().getAsLong());
break;
//add other primitive cases
default:
output.add(key, object.getValue());
}
}
}
内容总结
以上是互联网集市为您收集整理的java-如何通过保留键的数据类型将json序列化为另一个json?全部内容,希望文章能够帮你解决java-如何通过保留键的数据类型将json序列化为另一个json?所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。