在不使用Java中的POJO类的情况下解析不同的JSON响应
Parse different JSON responses without using POJO classes in Java
我正在Java中解析来自REST API的JSON响应,但我不想为每个响应创建一个Java类(POJO)(响应具有不同的数据结构和字段)。Java中是否有更通用的JSON解析器类似于JavaScript的直接语法?
下面的JSON只是众多REST端点之一的结果
{
"f1" : "volume",
"f2" : "gender",
"f3" : "days",
"f4" : [{
"id" : "F",
"name" : "female",
"values" : [{
"name" : "September",
"value" : 12
}
]
}, {
"id" : "M",
"name" : "male",
"values" : [{
"name" : "September",
"value" : 11
}
]
}
]
}
在JavaScript中,要访问女性的值:
jsonRoot.f4[0].values[0].value
这比必须创建大量Java类更简洁。你能提出类似的建议或避免创建许多POJO的方法吗?
如果您导入com.google.gson的jar。您可以获得如下值:
String str="{" +
" '"f1'" : '"volume'"," +
" '"f2'" : '"gender'"," +
" '"f3'" : '"days'"," +
" '"f4'" : [{" +
" '"id'" : '"F'"," +
" '"name'" : '"female'"," +
" '"values'" : [{" +
" '"name'" : '"September'"," +
" '"value'" : 12" +
" }" +
" ]" +
" }, {" +
" '"id'" : '"M'"," +
" '"name'" : '"male'"," +
" '"values'" : [{" +
" '"name'" : '"September'"," +
" '"value'" : 11" +
" }" +
" ]" +
" }" +
" ]" +
"}";
JsonParser parser=new JsonParser();
JsonObject object=(JsonObject)parser.parse(str);
String value=object.get("f4").getAsJsonArray().get(0).getAsJsonObject()
.get("values").getAsJsonArray().get(0).getAsJsonObject()
.get("value").getAsString();
String s="[0,{'"1'":{'"2'":{'"3'":{'"4'":[5,{'"6'":7}]}}}}]";
Object obj=JSONValue.parse(s);
JSONArray array=(JSONArray)obj;
System.out.println(array.get(1));
System.out.println(((JSONObject)array.get(1)).get("1"));
更多示例
json-simple.jar
Jackson映射到Map<String, Object>
也可以:
String data = "{'"f4'":[1, 2]}"
try {
Map<String, Object> value = mapper.readValue(data, Map.class);
System.out.println(value.get("f4"));
} catch (IOException e) {
e.printStackTrace();
}
为此定义POJO对象的值是静态类型检查,我仍然建议这样做
您可以使用org.json
库。
如果您使用maven:
<dependency>
<groupId>org.json</groupId>
<artifactId>json</artifactId>
<version>20150729</version>
</dependency>
或者下载jar:http://mvnrepository.com/artifact/org.json/json
Java示例:
import org.json.JSONObject;
public class JSONTest {
public static void main(String[] args) {
JSONObject jsonObject = new JSONObject("{'f1' : 'volume', 'f2' : 'gender', 'f3' : 'days'}"); // Truncated for example purpose
String f1 = jsonObject.getString("f1");
System.out.println(f1);
}
}
您还可以访问阵列
JSONArray f4Array = jsonObject.getJSONArray("f4");
然后对其进行迭代。
for (int i = 0; i < f4Array.length(); i++){
String id = f4Array.getJSONObject(i).getString("id");
String name = f4Array.getJSONObject(i).getString("name");
System.out.println(name);
System.out.println(id);
JSONArray values = f4Array.getJSONObject(i).getJSONArray("values");
for (int j = 0; j < values.length(); j++){
String dName = values.getJSONObject(j).getString("name");
int dValue = values.getJSONObject(j).getInt("value");
System.out.println(dName);
System.out.println(dValue);
}
}
如果使用Jquery,Jquery中有一个parseJson()函数。
相关文章:
- 如何在不在本地下载的情况下将url中提供的文件(pdf/doc)转换为json/string/base64格式
- 在不使用lodash-get的情况下从json中提取深层属性
- 在禁用ng的情况下搜索JSON对象(AngularJS)
- 如何避免JSON.stringify在特殊情况下返回undefined,从而为JSON.parse创建字符串失败
- 在什么情况下,应该.deep.equal失败,但使用JSON.stringify进行比较工作正常
- 在不使用jQuery的情况下解析json,并在HTML代码中添加值
- 在不更改大量代码的情况下重新构造Firebase JSON数据
- 在没有jsonp的情况下从另一个域获取数据(json格式)
- 如何在没有冒号、反斜杠、大括号或引号的情况下使用JSON.stringfy(anObject)
- 在没有JQuery的情况下将JSON数据获取到TVML项目中
- 在不知道名称的情况下检索json元素
- jQuery在没有数据库的情况下从php-json自动完成
- 在这种情况下,如何访问我的JSON代码
- 如何在不发生冲突的情况下处理多个json请求
- 如何在URL中不指定.html、.json的情况下配置web.xml来服务任何请求
- 在不使用AJAX的情况下将JSON字符串发送到php文件
- 在不使用jQuery的情况下连接两个JSON对象
- 在没有额外外部库的情况下,将JSON数据分组为周/月
- 如何在不丢失浮点精度的情况下填充 JSON 数据
- 在不知道名称的情况下访问 json 对象中的元素