Java Gson-将json解析为对象时忽略json字段
有一个问题与我的问题相似,但并不完全是我想要的 我有一个来自Web服务的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
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