Java中是否有一种通用的方式来解析Json?

4

我试过使用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) - 应返回'My Special Rate'
  2. getNameFromArray(adjustmentType, adjustments) - 应返回'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);
        }

我尝试使用Jackson,结果遇到了与Gson相同的问题。
JsonFactory jfactory = new JsonFactory();
        JsonParser jParser = jfactory.createJsonParser("Path of Json");
        while (jParser.nextToken() != JsonToken.END_OBJECT) {
            System.out.println(jParser.getCurrentName());;
        }

1
有一些库可以简化这项工作,例如Gson和Jackson。在这些库中搜索并选择最适合您特定情况的库。 - Luiggi Mendoza
@LuiggiMendoza:请查看我的问题。我已经提到我尝试过它们,但并没有找到我所提到的示例的任何方法。 - Mike
@DavidEhrmann:查询/读取它。 - Mike
1
这些库提供了你所需的,但是你的问题就像是“请替我完成这项工作,我太懒了”。相反地,请提供你尝试去解决问题的过程,我们将会帮助你。 - Luiggi Mendoza
添加了额外的信息。感谢@LuiggiMendoza。将尝试使用json-path。 - Mike
显示剩余2条评论
4个回答

7
如果你在说泛型时指的是标准库,那么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");
}

org.json库中没有任何东西使其比GSON或Jackson更标准或不标准 - 它只是一个概念验证,恰好比其他两个更旧。因此,使用该库还是其他库应基于适用情况。 - StaxMan
这很有帮助。另外,Json-path也很有趣,可能适合我的需求。标记为正确答案。 - Mike

2

您好,您可以使用 JASON READER 工具,它能够读取 JSON 数据并将其映射为 MAP。

以下是下载 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

调整|调整类型=贷款金额大于550K

调整|调整类型1=摊销期限小于30年

调整|利率=0.75

最优定价=false

总初始利率=1.95

费率名称=我的特殊费率

评级信息基准利率=1.


0
您可以使用标准的 JsonParser 工具,该工具是 javax.json 包的一部分。自 Java EE 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 数据结构


-1

或者你可以使用 Jodd JSON 解析器。你只需要反序列化输入字符串,结果将被收集在常规MapList中。

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

就这么简单 - 结果是尽可能通用的。然后只需调用 map.get("rateName") 来获取您的值,依此类推。

但请注意,如果需要进行调整,可以获得所需的方式,而无需使用某些实用程序方法来迭代元素并搜索正确的元素。如果可以,请更改 JSON,使其不具有 adjustments 数组,而是具有映射。

如果需要特定结果,只需通过输入字符串传递类型即可。了解更多关于解析功能的信息。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接