[英]Is there a generic way of parsing Json in Java?
我尝试过gson和Jackson解析器,遗憾的是我无法达到我想要的效果。
{
"rateName": "My Special Rate",
"adjustments": [
{
"adjustmentType": "LOAN_AMOUNT_GREATER_THAN_550K",
"rate": 0.75
},
{
"adjustmentType": "AMORTIZATION_TERM_LESS_THAN_30_YEARS",
"rate": -0.2
}
],
"errorTypes": [],
"premiumTaxs": [],
"renewalPremiums": [],
"totalInitialRate": 1.95,
"optimumPricing": false,
"miPricingVO": null,
"rateCardId": "BALS_NR",
"ratingInfoBaseRate": 1.4
}
以上是我要解析的Json。 我想创建泛型方法,使用它可以轻松地按名称访问值。 例如:
有没有办法做到这一点? 它应该是通用的,以便可以应用于任何Json文件。
附加信息:我尝试使用Gson,但这会解析整个文件并在找到数组时抛出错误。
JsonReader j = new JsonReader(new FileReader("Path of Json"));
j.beginObject();
while (j.hasNext()) {
String name = j.nextName();
if (name.equals("rateName")) {
System.out.println(j.nextString());
}
System.out.println(name);
}
我和杰克森一起尝试过和Gson一样。
JsonFactory jfactory = new JsonFactory();
JsonParser jParser = jfactory.createJsonParser("Path of Json");
while (jParser.nextToken() != JsonToken.END_OBJECT) {
System.out.println(jParser.getCurrentName());;
}
如果你的意思是标准库,当你说泛型时,那么org.json
就是那个库。
尽管不像GSON或Jackson那么直观,但很容易使用它:
JSONObject jsonData = new JSONObject(jsonString);
String rateName= jsonData.getString("rateName");//My Special Rate
要解析数组,您需要循环:
JSONArray adjustments = jsonData.getJSONArray("adjustments");
for(int i = 0; i < adjustments.length(); i++){
JSONObject adjustment = adjustments.getJSONObject(i);
String adjustmentType = adjustment.getString("adjustmentType");
}
您好您可以使用JASON READER,它读取JSON并将数据映射到MAP。
下面是下载JAR JASON READER的URL。
https://drive.google.com/open?id=0BwyOcFBoJ5pueXdadFFMS2tjLVU
以下是示例 -
package com;
import java.util.HashMap;
import java.util.Map;
import java.util.Map.Entry;
import com.JasonReader;
public class Test {
public static void main(String[] args) {
String request ="{\"rateName\": \"My Special Rate\",\"adjustments\":[{\"adjustmentType\": \"LOAN_AMOUNT_GREATER_THAN_550K\",\"rate\": 0.75},{\"adjustmentType\": \"AMORTIZATION_TERM_LESS_THAN_30_YEARS\",\"rate\": -0.2}],\"errorTypes\": [],\"premiumTaxs\": [],\"renewalPremiums\": [],\"totalInitialRate\": 1.95,\"optimumPricing\": false,\"miPricingVO\": null,\"rateCardId\": \"BALS_NR\",\"ratingInfoBaseRate\": 1.}";
//
Map<String,String> map =new HashMap<String,String>();
map=JasonReader.readJason(request,map);
//System.out.println(map);
for (Entry<String, String> entry : map.entrySet()) {
System.out.println(entry.getKey()+ "=" +entry.getValue());
}
}
}
输出 -
rateCardId = BALS_NR
调整|率1 = -0.2
miPricingVO = NULL
调整| adjustmentType = LOAN_AMOUNT_GREATER_THAN_550K
调整| adjustmentType1 = AMORTIZATION_TERM_LESS_THAN_30_YEARS
调整|率= 0.75
optimumPricing = FALSE
totalInitialRate = 1.95
rateName =我的特价
ratingInfoBaseRate = 1。
您可以使用标准的JsonParser ,它是javax.json包的一部分。 从第7版开始,此解析器是Java EE的一部分,您可以使用此解析器而无需任何其他库。
解析器允许您使用所谓的“拉解析编程模型”在JSON结构中导航
JsonParser parser = Json.createParser(myJSON);
Event event = parser.next(); // START_OBJECT
event = parser.next(); // KEY_NAME
String key = parser.getString(); // 'rateName'
event = parser.next(); // STRING_VALUE
String value=parser.getString(); // 'My Special Rate'
event = parser.next(); // START_ARRAY
....
但是当然你需要浏览你的json数据结构
或者你可以使用Jodd JSON解析器。 您只需要反序列化输入字符串,结果将收集在常规Map
和List
。
JsonParser jsonParser = new JsonParser();
Map<String, Object> map = jsonParser.parse(input);
这很简单 - 结果是最通用的。 然后只需调用map.get("rateName")
来获取您的值,依此类推。
但请注意,对于调整,您可以获得所需的方式,而无需迭代元素并搜索正确元素的某些util方法。 如果可以,请更改JSON以便您没有一系列adjustments
,而是一个地图。
如果需要特定结果,只需使用输入字符串传递类型即可。 查看有关解析功能的更多信息。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.