【问题标题】:How do I modify my function to retrieve json objects to a nested json?如何修改我的函数以将 json 对象检索到嵌套的 json?
【发布时间】:2018-07-05 17:39:47
【问题描述】:

这是我目前在代码中使用的 json:

{"forceDeviceLockout":0,"canStartValue":true,"destructOnRead":[30,60,300]}

我使用以下函数来获取 json 值:

private Object getValueForField(Field field) {
        if (runtimeConfiguration.has(field.fieldName) && field.updateFromServer) {
            try {
                Object value = runtimeConfiguration.get(field.fieldName);
                if (value instanceof JSONArray) {
                    JSONArray values = (JSONArray) value;
                    if (values.get(0) instanceof Number) {
                        long[] retVals = new long[values.length()];
                        for (int i = 0; i < values.length(); i++) {
                            retVals[i] = ((Number) values.get(i)).longValue();
                        }
                        return retVals;
                    }
                } else if (value instanceof Number) {
                    return ((Number) value).longValue();
                } else {
                    return value;
                }
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
        return field.defaultValue;
    }

现在,我有一个新的嵌套 json 如下:

{"forceDeviceLockout":0,"canStartValue":true,"destructOnRead":[30,60,300],"NEWVALUE":{"canStartNewValue1":true,"canStartroupValue":true}

在新的 json 中,我添加了嵌套的 json 对象:NEWVALUE,它本身有 2 个对象。

我在 json 方面有点弱,所以不确定如何修改我的代码以检索上述单个值。有什么想法吗?

【问题讨论】:

  • 您发布的JSON无效。

标签: android android-json jsonschema2pojo


【解决方案1】:

我不知道你为什么把它弄得这么复杂!但请参阅我为您编写的这段代码。它可能会给你一个想法:

public void printFieldsValues(Object object){
    try{
        Field[] fields = object.getClass().getFields();

        JSONObject jsonObject = new JSONObject();

        for(Field field : fields){
            jsonObject.put(field.getName(), field.get(object));
        }

        JSONObject newValue = new JSONObject("{\"canStartNewValue1\":true,"
                                             + "\"canStartroupValue\":true}");

        jsonObject.put("NEWVALUE", newValue);

        printJson(jsonObject);

    }catch(Exception e){
        e.printStackTrace();
    }
}

public void printJson(JSONObject jsonObject) throws JSONException{
    Iterator<String> keys = jsonObject.keys();
    String           key;
    while(keys.hasNext()){
        key = keys.next();
        try{
            printJson(new JSONObject(jsonObject.getString(key)));
        }catch(Exception e){
            Log.d("TAG", "key = " + key);
            Log.d("TAG", "value = " + jsonObject.get(key).toString());
        }
    }
}

在你的主对象中你可以这样称呼它:

printFieldsValues(this);

【讨论】:

    【解决方案2】:

    如果这些 json 键是预定义的,我们可以像这样访问它们

       public class SampleModel {
    
            public int forceDeviceLockout;
            public boolean canStartValue;
            public int[] destructOnRead;
            public NestedModel NEWVALUE; 
    }
    
    
    
      public class NestedModel {
        public boolean canStartNewValue1;
        public boolean canStartroupValue;
    }
    
    
    
      Gson gson = new Gson();
      SampleModel sampleModel = gson.fromJson("{\"forceDeviceLockout\":0,\"canStartValue\":true,\"destructOnRead\":[30,60,300],\"NEWVALUE\":{\"canStartNewValue1\":true,\"canStartroupValue\":true}}",SampleModel.class);
      Log.d("canStartNewValue : " ,sampleModel.canStartNewValue)
      Log.d("canStartNewValue1 : " , sampleModel.NEWVALUE.canStartNewValue1);
    

    注意:需要添加依赖compile 'com.google.code.gson:gson:2.8.2'

    【讨论】:

    • 是否可以不使用 gson 而只修改我的代码?为了让您深入了解我的代码,这是链接:stackoverflow.com/questions/48447684/…
    • @MarissaNicholas 建议您使用 GSON 或任何其他替代库将 JSON 转换为 POJO 并再次返回。它们可以帮助您处理上面编写的样板代码
    • @AkshayChordiya 有没有更简单的方法可以在不引用 2 个类的情况下做到这一点,比如枚举字段?我还需要嵌套我的子 json 值吗?
    • @MarissaNicholas 理想情况下,我们使 POJO 类与 JSON 的出现方式完全相同,即在您的情况下,您的 JSON 是嵌套的,在这种情况下,您需要 2 个 POJO 来表示 JSON。我认为枚举不起作用
    【解决方案3】:

    如果您只想修改当前代码以解析收到的 json,您可以添加 if(value instance of JSONObject){ JSONObject jsonObject = (JSONObject) value; return jsonObject; }

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-12-07
      • 1970-01-01
      • 2014-08-11
      • 2017-08-01
      • 1970-01-01
      • 2017-06-29
      • 1970-01-01
      • 2019-10-11
      相关资源
      最近更新 更多