如何编写json字段来检索它?

时间:2018-01-25 16:29:24

标签: android json android-json

我目前正在使用json为我的代码检索一个布尔值数组。但是,我正在添加一个子域来实现其中的另一个数组,但是我对json并不好,并且有点坚持如何去做。 到目前为止,这是我的代码:

字段值:

 public enum Field {



       /**
         * Runtime Config Fields
         **/
        FIELD_CAN_CHANGE_PASSWORD("canChangePassword", true, canUpdate),
        FIELD_MAX_AUTO_DOWNLOAD_SIZE("maxAutoDownloadSize", 5000000L),
        FIELD_ALWAYS_REAUTHENTICATE("alwaysReauthenticate", false, canUpdate),
        FIELD_CAN_START_CALL("canStartCall", false),
        FIELD_ROOMS_ENABLED("roomsEnabled", !Core.isMessenger()),
        FIELD_CAN_CREATE_ROOM("canCreateRoom", !Core.isMessenger(), canUpdate),
        FIELD_MAX_ENVELOPE_TTL("maxTTL", Core.isMessenger() ? 518400L : 31536000L, canUpdate),
        FIELD_MAX_BURN_ON_READ_TTL("maxBOR", 0L, canUpdate),
        FIELD_MAX_UPLOAD_SIZE("maxUploadSize", -1L, true),
        FIELD_FRIEND_FINDER("friendFinder", !Core.isEnterprise(), canUpdate),
        FIELD_ONLY_SHOW_IN_NETWORK_CONTACTS("onlyShowInNetwork", false),
        FIELD_CAN_ADD_CONTACT("canAddContact", true, canUpdate),
        FIELD_FORCE_DEVICE_LOCKOUT("forceDeviceLockout", 5L, canUpdate),
        FIELD_VERIFICATION_MODE("verificationMode", VerificationMode.OPTIONAL.getValue(), true),
        FIELD_ENABLE_NOTIFICATION_PREVIEW("enableNotificationPreview", true, true),
        FIELD_DIRECTORY_ENABLED("directoryEnabled", true, true);

        public String fieldName;
        public Object defaultValue;
        public boolean updateFromServer;

        Field(String key, Object defaultValue) {
            this(key, defaultValue, true);
        }

        Field(String key, Object defaultValue, boolean updateFromServer) {
            this.fieldName = key;
            this.defaultValue = defaultValue;
            this.updateFromServer = updateFromServer;
        }
    }

将值放在字段中:

 private void putValueForField(JSONObject configuration, Field field) {
        try {
            if (configuration.isNull(field.fieldName)) {
                Object value = field.defaultValue;
                if (value instanceof long[]) {
                    JSONArray array = new JSONArray();
                    for (long obj : (long[]) field.defaultValue) {
                        array.put(obj);
                    }
                    value = array;
                }
                runtimeConfiguration.put(field.fieldName, value);
            } else {
                runtimeConfiguration.put(field.fieldName, configuration.get(field.fieldName));
            }
        } catch (JSONException e) {

        }
    }

获得价值观:

 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;
    }

使用上述字段的方法之一:

 public boolean canChangePassword() {
        return (boolean) getValueForField(Field.FIELD_CAN_CHANGE_PASSWORD);
    }

我的新json是:

  

{"enableNotificationPreview":true,"destructOnRead":[30,60,300],"alwaysReauthenticate":false,"forceDeviceLockout":0,"permmod":1516894585,"maxBOR":0,"roomsEnabled":true,"directoryEnabled":true,"canStartCall":true,"canAddContact":true,"legacyDownload":false,"verificationMode":1,"restrictedAdmin":false,"canChangePassword":true,"friendFinder":true,"NEWVALUE":{"canStartNewValue1":true,"canStartroupValue":true,"canVideoCall":true,"canStartRoomValue":true,"canAddtoValue":true,"canStartValueshare":true},"canCreateRoom":true,"maxTTL":2592000,"onlyShowInNetwork":false,"maxUploadSize":null,"availableEnvelopeTTL":[0,600,3600,86400,604800,2592000],"maxAutoDownloadSize":7340032}

我插入的地方:

  

&#34; NEWVALUE&#34; {&#34; canStartNewValue1&#34;:真,&#34; canStartroupValue&#34;:真,&#34; canVideoCall&#34;:真,&#34; canStartRoomValue&#34;:真,&#34; canAddtoValue&#34;:真,&#34; canStartValueshare&#34;:真}

不确定如何更新我的putValueForField来反映这个新的json和相应的字段。任何的想法?

1 个答案:

答案 0 :(得分:1)

要从json对象检查和检索JSONObject,您可以修改方法以检查instance of JSONObject并为其指定值。

 private void putValueForField(JSONObject configuration, Field field) {
        try {
            if (configuration.isNull(field.fieldName)) {
                Object value = field.defaultValue;
                if (value instanceof long[]) {
                    JSONArray array = new JSONArray();
                    for (long obj : (long[]) field.defaultValue) {
                        array.put(obj);
                    }
                    value = array;
                }
                // this is how you check if fieldName is of type jsonobject
                if (value instanceof JSONObject) {
                    JSONObject valueObject = configuration.getJSONObject(field.fieldName);
                    value = valueObject;
                }
                runtimeConfiguration.put(field.fieldName, value);
            } else {
                runtimeConfiguration.put(field.fieldName, configuration.get(field.fieldName));
            }
        } catch (JSONException e) {

        }
    }

形成我能理解的你只是从JSON中获取值并在这种情况下将其保存在字段中:

我认为在这种方法中,你最终只是将所有值存储为object,所以在检索时你必须再次检查所有这些。

如果您从具有固定对象字段和对象值的服务器获得响应,则应该从该配置创建一个类,您将知道它将返回什么。这真的会让生活变得更轻松。

或者如果您只需要配置来获取/更新或放置值,您可以将其保存在json对象本身Android JSON doc reference

例如,假设你有这个jsonobject本身,我已经添加了下面的工作示例,希望这会有所帮助。

import org.json.*;

class Main {
    public static void main(String[] args) throws JSONException {
        String jsn = "{\"enableNotificationPreview\":true,\"destructOnRead\":[30,60,300],\"" +
                "alwaysReauthenticate\":false,\"forceDeviceLockout\":0,\"NEWVALUE\":{\"canStartNewValue1\":true," +
                "\"canStartroupValue\":true,\"canVideoCall\":true,\"canStartRoomValue\":true},\"canCreateRoom\":true," +
                "\"maxTTL\":2592000,\"onlyShowInNetwork\":false,\"maxUploadSize\":null,\"availableEnvelopeTTL\"" +
                ":[0,600,3600,86400,604800,2592000],\"maxAutoDownloadSize\":7340032}";

        JSONObject jsnObj = new JSONObject(jsn);
        Object enableNotificationPreview = jsnObj.get("enableNotificationPreview");
        // or if you know it will be boolean
        boolean enableNotificationPreviewBool = jsnObj.getBoolean("enableNotificationPreview");
        System.out.println(enableNotificationPreview);
//        output : true
        System.out.println(enableNotificationPreviewBool);
//        output : true

        JSONObject NEWVALUEObj = jsnObj.getJSONObject("NEWVALUE");
//        now again you can extract values from it
        boolean canStartNewValue1 = NEWVALUEObj.getBoolean("canStartNewValue1");
        System.out.println(canStartNewValue1);
        NEWVALUEObj.put("canStartNewValue1", false);
        System.out.println(NEWVALUEObj.toString());
        jsnObj.put("forceDeviceLockout", 23456);
//        now canStartNewValue1 value is changed to false in the object
//        and forceDeviceLockout is also 23456
        System.out.println(jsnObj.toString());
    }
}