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

时间:2014-10-13 16:34:34

标签: java json jackson gson

我曾尝试使用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'
  3. 有办法做到这一点吗?它应该是通用的,以便可以应用于任何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());;
            }
    

4 个答案:

答案 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解析器。您只需要反序列化输入字符串,结果将在常规MapList中收集。

JsonParser jsonParser = new JsonParser();
Map<String, Object> map = jsonParser.parse(input);

简单 - 结果是最通用的。然后只需致电map.get("rateName")即可获得您的价值,依此类推。

但请注意,对于调整,您可以获得所需的方式,而无需迭代元素并搜索正确元素的某些util方法。如果可以,请更改JSON,以便您没有adjustments的数组,而是地图。

如果您需要特定结果,只需使用输入字符串传递类型即可。详细了解parsing features