json对象:需要创建一个检索值的泛型方法

时间:2013-01-30 07:03:47

标签: java json

{
    "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解析每个值,怎么可能 我写了一个泛型方法或者它已经存在,比如getvalue(jsondata`),它接受一个json对象找到我需要迭代的级别并获取值。我有很多不同的json响应,所以一个帮助我检索json值的通用方法将使我的工作变得容易。

2 个答案:

答案 0 :(得分: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;
    }
}

答案 1 :(得分:0)

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

设置这些Java类是一项繁琐的工作,如果你手工完成,你需要在每个类中创建与每个JSON属性相对应的属性,然后注释该类以告诉JAX / B对应。

article说明了如何执行此操作。

似乎有Eclipse tools自动化这种手动苦差事。

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

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

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