我正在开发一个Android应用程序,我有一个Web服务调用,该服务返回一个Json对象作为响应,但在某些情况下,它返回一个不同的结构,请找到结构:
案例1:Json结构 Json有一个名为"来自"和"到"它们的类型为String。
Ex:" to":" BVRT", "来自":" NS",
案例2:Json结构 Json有一个名为"来自"和"到"哪些是自定义对象。 例如: "来自":{ " name":" BANGALORE CY JN", "代码":" SBC" }, "到":{ " name":" BHIMAVARAMTOWN", "代码":" BVRT" },
由于存在大量嵌套对象,我使用Gson Library来解析json对象,这使得生活变得更容易,而不是手动解析。
问题面对 我如何构建我的pojo类,因为对于相同的api调用有两种不同的结构,我已经尝试过JsonIgnore但它没有工作,因为它在两种情况下都有相同的json键。
请查看屏幕截图,以便更好地理解哪些内容具有完整的Json结构,希望得到一个带有示例代码段的回复,因为这是一个我们无法继续使用该应用程序的其他功能的阻止程序。Json Structure
答案 0 :(得分:0)
经过几个小时的研究,我得到了一个解决方案,这里我的解决方案无需创建单独的模型类来处理相同API调用的不同Json结构:
模型类
public class TrainDetails {
@SerializedName("to")
private String toString;
@SerializedName("from")
private String fromString;
@SerializedName("to")
private ToStationPnrPojo fromStationObject;
@SerializedName("from")
private ToStationPnrPojo toStationObject;
}
现在使用ExclusionStrategy构造一个Gson对象,在这里你可以指定你需要在我们的模型类中排除哪些字段,以匹配从服务器端发送的Json结构。
try {
JSONObject jsonObject=new JSONObject(result);
JSONArray jsonArray=jsonObject.optJSONArray("train");
if(jsonArray.length()>0){
JSONObject jsonObject1= jsonArray.getJSONObject(0);
Object test=jsonObject1.get("to");
if(test instanceof String){
Log.e("Test","Instance OF String");
CustomExclusionStrategy ges = new CustomExclusionStrategy(TrainDetails.class, "toStationObject","fromStationObject");
gson= new GsonBuilder().setExclusionStrategies(new CustomExclusionStrategy[]{ges}).create();
}else{
Log.e("Test","Instance OF Custom object");
CustomExclusionStrategy ges = new CustomExclusionStrategy(TrainDetails.class, "toString","fromString");
gson= new GsonBuilder().setExclusionStrategies(new CustomExclusionStrategy[]{ges}).create();
}
}
} catch (JSONException e) {
e.printStackTrace();
}
我们可以将字段名称传递给CustomeExclusionStrategy,指定在从服务器解析Json时排除这些字段的Gson。
<强> CustomExclusionStrategy 强>
public class CustomExclusionStrategy implements ExclusionStrategy {
private final List<String> _skipFields = new ArrayList<String>();
private final Class<?> _clazz;
public CustomExclusionStrategy(Class<?> clazz, String... fields) {
_clazz = clazz;
for (String field : fields) {
_skipFields.add(field);
}
}
@Override
public boolean shouldSkipClass(Class<?> clazz) {
return false;
}
@Override
public boolean shouldSkipField(FieldAttributes f) {
return f.getDeclaringClass() == _clazz
&& _skipFields.contains(f.getName());
}
}
希望如果其他任何人在处理不在客户端应用程序控件中的Json解析时遇到类似问题,这将会有所帮助。