2
{
    "CollegeResponse": {
        "departmentDetails": {
            "id": 42,
            "departmentName": "computer science",
            "labDetails": {
                "id": 21,
                "description": "machine learning",
                "assistant": {
                    "empid": 201101,
                    "isPermanent": false
                }
            },
            "affilated": false
        }
    }
}


responseInString = response.getEntity(String.class);
JSONObject json = new JSONObject(responseInString);
String id = json.getJSONObject("CollegeResponse").getJSONObject("departmentDetails").getString("id");

目前我正在使用这个过程来验证 db 的 json 响应。但是如果我的 json 响应很大并且我需要用 db 解析每个值,我该如何编写一个通用方法或者它是否已经存在,比如接受 json 对象的 getvalue(jsondata`) 找到我需要迭代的级别并获得价值。我有很多不同的 json 响应,所以一个可以帮助我检索 json 值的通用方法会让我的工作变得简单。

4

2 回答 2

1

我使用字符串标记化从 json 对象中检索值。您需要提供 json 对象和字段值来获取特定键的值。我们可以进一步优化它吗?

package javaapplication1;

import java.util.StringTokenizer;
import net.sf.json.JSONException;
import net.sf.json.JSONObject;

public class Tokenization {

    public static void main(String args[]) {
        JSONObject parentData = new JSONObject();
        JSONObject childData = new JSONObject();
        parentData.put("command", "dance");
        parentData.put("uid", "123123123");
        childData.put("uid", "007");
        childData.put("username", "sup");
        childData.put("password", "bros");
        parentData.put("params", childData);
        System.out.println(parentData);
        String result = getValue(parentData, "params.uid");
        System.out.println("Result:" + result);
    }

    public static String getValue(JSONObject inputJson, String field) {
        String resultValue = null;
        try {
            StringTokenizer stJson = new StringTokenizer(field, ".");
            int count = stJson.countTokens();
            JSONObject objecStore = new JSONObject();
            objecStore = inputJson;
            while (stJson.hasMoreTokens()) {
                String st = stJson.nextToken();
                if (count > 1) {
                    JSONObject objNode = objecStore.getJSONObject(st);
                    count--;
                    objecStore = objNode;
                } else {
                    System.out.println(st);
                    resultValue = objecStore.getString(st);
                }
            }

        } catch (JSONException e) {
        }
        return resultValue;
    }
}
于 2013-02-01T10:36:48.373 回答
0

我认为您的意思是“解析”而不是“验证”-您的目标是在 Java 代码中使用数据。JAX/B 标准定义了一种 Java 对象和等效 JSON 表示之间的映射方式。在您的示例中,您将拥有诸如 CollegeResponse 和 DepartmentDetails 之类的类。

如果手动设置这些 Java 类有点繁琐,需要在每个类中创建与每个 JSON 属性对应的属性,然后对类进行注解以告知 JAX/B 对应关系。

本文描述了如何做到这一点。

似乎确实有Eclipse 工具可以自动完成这项手动工作。

完成后,将 JSON 转换为 Java 的代码变为

JAXBContext context = JAXBContext.newInstance(CollegeResponse.class);
Unmarshaller um = context.createUnmarshaller();
CollegeResponse college = (CollegeResponse ) um.unmarshal(
          /* some Reader for the JSON string */ );

最终的效果是,与其编写大量的小 getJSONObject() 调用,不如投资于设置相应的类,这应该会产生结构良好的代码,其中数据的处理,即真正的业务逻辑,与解析代码,我将其视为“管道”。

于 2013-01-30T07:20:28.187 回答