Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/19.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Gson-将json解析为对象时忽略json字段_Java_Android_Json_Gson - Fatal编程技术网

Java Gson-将json解析为对象时忽略json字段

Java Gson-将json解析为对象时忽略json字段,java,android,json,gson,Java,Android,Json,Gson,有一个问题与我的问题相似,但并不完全是我想要的 我有一个来自Web服务的JSON响应,比如说: 在这个JSON中,我只对distance对象感兴趣。我的问题是,我怎么能忽略所有其他字段 我尝试从腿部开始构建对象,因为它是从距离到根的第一个非重复对象名称 这是我的目标: public class MyObject { public ArrayList<Distance> legs; public static class Distance { pub

有一个问题与我的问题相似,但并不完全是我想要的

我有一个来自Web服务的JSON响应,比如说:

在这个JSON中,我只对
distance
对象感兴趣。我的问题是,我怎么能忽略所有其他字段

我尝试从
腿部开始构建对象,因为它是从
距离
到根的第一个非重复对象名称

这是我的目标:

public class MyObject {

    public ArrayList<Distance> legs;

    public static class Distance {
        public String text;
        public String value;
    }
}
公共类MyObject{
公共ArrayList支腿;
公共静态类距离{
公共字符串文本;
公共字符串值;
}
}
但是
ArrayList legs
总是
null


我怎样才能做到这一点?忽略假装的json字段左侧的字段。

我认为Gson的原理是将json结构映射到对象图。因此,在您的例子中,我可能会创建所有需要的java对象来正确映射json结构。除此之外,也许有一天你会需要一些关于反应的其他信息,这样进化就更容易了。诸如此类(我认为是正确的方式):

类型适配器:此实现将首先将Json文档解组到
JsonElement
s树中,然后检索所需的
JsonObject
s,以便通过委托创建
Distance
对象(很抱歉代码不好,编写得很快)


希望有帮助。

distance
是JSON数组中名为
legs
@SotiriosDelimanolis的JSON对象中键值对的名称是的,我知道。但我不明白你评论的背景。您能解释一下吗?您有一个名为
legs
ArrayList
字段。这将映射到一个JSON数组,其中包含与
Distance
类格式匹配的JSON对象。你少了一层。实际的JSON有一个名为
legs
的JSON数组,但其中的JSON对象有名为
distance
的字段。
public class MyObject {

    public ArrayList<Distance> legs;

    public static class Distance {
        public String text;
        public String value;
    }
}
class RouteResponse {
    private List<Route> routes;
}
class Route {
    private List<Bound> bounds;
    private String copyrights;
    private List<Leg> legs;
}
class Leg {
    private Distance distance;
    private Duration duration;
    private String endAddress;
    ...
}
class TextValue {
    private String text;
    private String value;
}
class Distance extends TextValue {
}
// And so on
public class RouteResponse {

    private List<Distance> distances;

   // add getters / setters
}

public class Distance {

    private String text;
    private String value;

   // add getters / setters
}
public class RouteResponseTypeAdapterFactory implements TypeAdapterFactory {

    @Override
    public <T> TypeAdapter<T> create(Gson gson, TypeToken<T> type) {
        if (type.getRawType() == RouteResponse.class) {
            return (TypeAdapter<T>)new RouteResponseTypeAdapter(gson);
        }
        return null;
    }
}
public class RouteResponseTypeAdapter extends TypeAdapter<RouteResponse> {

    private final TypeAdapter<JsonElement> jsonElementTypeAdapter;
    private final TypeAdapter<Distance> distanceTypeAdapter;

    public RouteResponseTypeAdapter(Gson gson) {
        this.jsonElementTypeAdapter = gson.getAdapter(JsonElement.class);
        this.distanceTypeAdapter = gson.getAdapter(Distance.class);
    }

    @Override
    public void write(JsonWriter out, RouteResponse value) throws IOException {
        throw new UnsupportedOperationException("Not implemented");
    }

    @Override
    public RouteResponse read(JsonReader jsonReader) throws IOException {
        RouteResponse result = new RouteResponse();
        List<Distance> distances = new ArrayList<>();
        result.setDistances(distances);
        if (jsonReader.peek() == JsonToken.BEGIN_OBJECT) {
            JsonObject responseObject = (JsonObject) jsonElementTypeAdapter.read(jsonReader);
            JsonArray routes = responseObject.getAsJsonArray("routes");
            if (routes != null) {
                for (JsonElement element:routes) {
                    JsonObject route = element.getAsJsonObject();
                    JsonArray legs = route.getAsJsonArray("legs");
                    if (legs != null) {
                        for (JsonElement legElement:legs) {
                            JsonObject leg = legElement.getAsJsonObject();
                            JsonElement distanceElement = leg.get("distance");
                            if (distanceElement != null) {
                                distances.add(distanceTypeAdapter.fromJsonTree(distanceElement));
                            }
                        }
                    }
                }
            }
        }
        return result;
    }
}
    String json = "{ routes: [ ....."; // Json document
    Gson gson = new GsonBuilder().registerTypeAdapterFactory(new RouteResponseTypeAdapterFactory()).create();
    RouteResponse response = gson.fromJson(json, RouteResponse.class);
    //response.getDistances() should contain the distances