我曾尝试使用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());;
}
答案 0 :(得分:4)
如果您指的是通用标准库,那么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");
}
答案 1 :(得分:3)
您好您可以使用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
调整| RATE1 = -0.2
miPricingVO =空
调整| adjustmentType = LOAN_AMOUNT_GREATER_THAN_550K
调整| adjustmentType1 = AMORTIZATION_TERM_LESS_THAN_30_YEARS
调整|率= 0.75
optimumPricing =假
totalInitialRate = 1.95
rateName =我的特价
ratingInfoBaseRate = 1。
答案 2 :(得分:0)
您可以使用标准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数据结构
答案 3 :(得分:-1)
或者你可以使用Jodd JSON解析器。您只需要反序列化输入字符串,结果将在常规Map
和List
中收集。
JsonParser jsonParser = new JsonParser();
Map<String, Object> map = jsonParser.parse(input);
简单 - 结果是最通用的。然后只需致电map.get("rateName")
即可获得您的价值,依此类推。
但请注意,对于调整,您可以获得所需的方式,而无需迭代元素并搜索正确元素的某些util方法。如果可以,请更改JSON,以便您没有adjustments
的数组,而是地图。
如果您需要特定结果,只需使用输入字符串传递类型即可。详细了解parsing features。