使用Gson Library

时间:2016-03-24 23:44:52

标签: android json gson

我正在开发一个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

1 个答案:

答案 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解析时遇到类似问题,这将会有所帮助。