繁体   English   中英

是否有一种在Java中解析Json的通用方法?

[英]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。 我想创建泛型方法,使用它可以轻松地按名称访问值。 例如:

  1. getName(rateName) - 应该返回'我的特价'
  2. getNameFromArray(adjustmentType,adjustment) - 应返回'LOAN_AMOUNT_GREATER_THAN_550K'

有没有办法做到这一点? 它应该是通用的,以便可以应用于任何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解析器。 您只需要反序列化输入字符串,结果将收集在常规MapList

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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM