Java 从JSON的深层获取值

Java 从JSON的深层获取值,java,json,gson,Java,Json,Gson,我正在连接到第三方API并返回一个长JSON字符串。我只需要它的一个值,但它位于层次结构的深处。有没有一种简单的方法可以不经过整个过程就得到它?我到处看了看,但没有什么是容易的 下面是我的例子: "response":{"status":1,"httpStatus":200,"data":{"myDesiredInfo":"someInfo"},"errors":[],"errorMessage":null}} 我一直在尝试使用Gson,以便将这个blob作为JsonObject。我确信有一些

我正在连接到第三方API并返回一个长JSON字符串。我只需要它的一个值,但它位于层次结构的深处。有没有一种简单的方法可以不经过整个过程就得到它?我到处看了看,但没有什么是容易的

下面是我的例子:

"response":{"status":1,"httpStatus":200,"data":{"myDesiredInfo":"someInfo"},"errors":[],"errorMessage":null}}
我一直在尝试使用Gson,以便将这个blob作为JsonObject。我确信有一些简单的事情,比如:

jsonObject.get("myDesiredInfo") 
或者至少像这样:

jsonObject.get("response.data.myDesiredInfo") 
但它似乎并不存在

那么,是否有任何解析器允许我这样做

这是我的json字符串

String s="{"age":0,"name":"name","email":"emailk","address":{"housename":"villa"}}";
我使用以下代码获取housename

    JsonElement je = new JsonParser().parse(s);
    JsonObject asJsonObject = je.getAsJsonObject();
    JsonElement get = asJsonObject.get("address");
    System.out.println(s + "\n" + get);
    JsonObject asJsonObject1 = get.getAsJsonObject();
    JsonElement get1 = asJsonObject1.get("housename");
    System.out.println(get1);
以下是我的输出:

{"age":0,"name":"name","email":"emailk","address":{"housename":"villa"}}
{"housename":"villa"}
"villa"

我认为没有其他方法可以做到这一点。我还尝试了其他方法,但没有得到任何输出。

大多数语言都有一个JSON解码库,其中很多是本地语言。不知道您使用的是什么语言,以下是PHP示例:

$jsonObj = json_decode($json);
$json->response->data->myDesiredInfo;

Ruby、Python、Java—所有这些语言都有很好的库。

以下是从jsonObject检索的方法

JSONObject jObject = new JSONObject(yourresponse);
Log.i("Desired Info is ",jObject.getJSONObject("response").getJSONObject("data").getString("myDesiredInfo"));

我编写了一个小实用程序方法,它使用Gson的API从一个JSON对象获取一个字符串形式的值,该值基于java.util.List的值。因此,对于我最初的问题,列表对象将是“response”、“data”、“myDesiredInfo”

当然这是可以改进的,但这只是一个开始

/*
 * Takes a JsonObject and parses it for a primitive value, going level by level
 * according to the values in @infos
 */
public static String parseJson(JsonObject json, List<String> infos) {

    try {
        if(infos.size() == 0) {
            return json.toString();
        }

        JsonElement je = json.get((String)infos.get(0));
        infos.remove(0);

        if(je instanceof JsonObject) {
            return parseJson(je.getAsJsonObject(), infos);          
        } else {
            return je.getAsString();
        }           
    } catch (Exception e) {
        e.printStackTrace();
        return null;
    }
}
/*
*获取一个JsonObject并逐级解析它作为一个基元值
*根据@infos中的值
*/
公共静态字符串parseJson(JsonObject json,列表信息){
试一试{
如果(infos.size()==0){
返回json.toString();
}
JsonElement je=json.get((字符串)infos.get(0));
信息删除(0);
if(JsonObject的je实例){
返回parseJson(je.getAsJsonObject(),infos);
}否则{
返回je.getAsString();
}           
}捕获(例外e){
e、 printStackTrace();
返回null;
}
}

您使用哪种语言来解释json?JavaScript、c#等等……啊,Java,看这个问题的答案。。。谢谢,Dan,第一个答案允许我获得最高级别的值,但是没有任何东西可以深入到较低级别的值。在我的情况下,我可能会像解析其他java字符串一样简单地解析这个字符串。我不确定您是否理解。如果您创建了一个与json具有相同属性的类,那么您可以将json强制转换为“yourClass”类型的对象。这将使您能够执行myclassobject.Response.Data.MyDesiredInfo。您可以使用is链接从json自动生成类。是的,这样做了。不过,还是有点令人失望。但是如果没有其他人有更优雅的方式,我会除了这个答案。谢谢你,帕瓦西!我本来打算为我的项目编写一个类似的代码片段,但我想看看是否有一种优雅的方式可以在Java中实现这一点。看起来没有(为什么我还要写这篇评论!!??)。