Замените все ключи в объекте JSON, состоящем из JSONArray

EL323 спросил: 28 апреля 2018 в 09:02 в: java

У меня есть JSONObject, который состоит из JSONArrays против некоторых ключей.

Вот пример JSONObject:

Вход:

{"UserKey":"DLPAgent","Operation":"DLPRuleMatch","OrganizationId":"2f6cb1a6-ecb8-4578-b680-bf84ded07ff4","IncidentId":"2b2f39ad-84ec-4dce-5800-08d5bee87822","Workload":"OneDrive","SensitiveInfoDetectionIsIncluded":false,"RecordType":11,"Version":1,"UserId":"DLPAgent","CreationTime":"2018-05-21T06:46:18","SharePointMetaData":{"UniqueID":"5710471b-f370-4f0d-be43-f6ba83645137","SiteCollectionGuid":"1692891b-2a42-431e-befa-1da656ce5ec8","SiteCollectionUrl":"https://emumbapk-my.sharepoint.com/personal/qa_emumbapk_onmicrosoft_com","FileName":"Classified.docx","FilePathUrl":"https://emumbapk-my.sharepoint.com/personal/qa_emumbapk_onmicrosoft_com/Documents/Classified.docx","FileOwner":"qa@emumbaPK.onmicrosoft.com","From":"qa@emumbaPK.onmicrosoft.com","ItemCreationTime":"2018-04-24T11:40:09","ItemLastModifiedTime":"2018-04-24T11:40:23"},"PolicyDetails":[{"PolicyName":"My policy","Rules":[{"Actions":["NotifyUser"],"RuleId":"61e36207-5ad7-4bc2-94f0-7f8b207e142c","RuleMode":"Enable","ConditionsMatched":{"SensitiveInformation":[{"Confidence":75,"Count":1,"SensitiveType":"a2ce32a8-f935-4bb6-8e96-2a5157672e2c"},{"Confidence":85,"Count":1,"SensitiveType":"e55e2a32-f92d-4985-a35d-a0b269eb687b"},{"Confidence":94,"Count":1,"SensitiveType":"a44669fe-0d48-453d-a9b1-2cc83f2cba77"}]},"Severity":"Low","RuleName":"Low volume of content detected My policy"}],"PolicyId":"82111a23-de2c-418f-b052-67e1ef639100"}],"Id":"73734ce7-fb54-41ab-ec00-08d5bee68e61","UserType":4}

Я хочу заменить все ключи своими собственными ключами, сохраняя значения.

Например, я хочу заменить UserKey с помощью user_key. Как я могу это сделать?

С помощью простого JSONObject я использовал:

JSONObject.put("my_key" , JSONObject.get("OriginalKey"));

Но теперь я не могу использовать JSONObject.get("OriginalKey") для значения JSONArray для ключа.

2 ответа

Есть решение
Srivenu ответил: 28 апреля 2018 в 10:43
public class TestMain {
    public static void main(String[] args) throws Exception {
        JSONObject requiredJSONObject = performJSONObject("Your JSONObject");
    }    public static JSONObject performJSONObject(JSONObject inputObject) throws Exception {
        JSONObject resultObject = new JSONObject();
        Iterator iterator = inputObject.keys();
        while (iterator.hasNext()) {
            String key = (String) iterator.next();
            if (inputObject.get(key) instanceof JSONObject) {
                JSONObject jsonObject = (JSONObject) inputObject.get(key);
                resultObject.put(getModifiedKey(key), performJSONObject(jsonObject));
            } else if (inputObject.get(key) instanceof JSONArray) {
                JSONArray jsonArray = (JSONArray) inputObject.get(key);
                resultObject.put(getModifiedKey(key), performJSONArray(jsonArray));
            } else {
                resultObject.put(getModifiedKey(key), inputObject.get(key));
            }
        }
        return resultObject;
    }    public static JSONArray performJSONArray(JSONArray inputArray) throws Exception {
        JSONArray resultArray = new JSONArray();
        for (int i = 0; i < inputArray.length(); i++) {
            if (inputArray.get(i) instanceof JSONObject) {
                JSONObject jsonObject = (JSONObject) inputArray.get(i);
                resultArray.put(i, performJSONObject(jsonObject));
            } else if (inputArray.get(i) instanceof JSONArray) {
                JSONArray jsonArray = (JSONArray) inputArray.get(i);
                resultArray.put(i, performJSONArray(jsonArray));
            } else {
                resultArray.put(i, inputArray.get(i));
            }
        }
        return resultArray;
    }    public static String getModifiedKey(String strn) {
        String[] r = strn.split("(?=\\p{Upper})");
        String result = "";
        for (String str : r)
            result += str.toLowerCase() + "_";
        return result.substring(0, result.length() - 1);
    }
}

Здесь нам нужно использовать рекурсию, решение может помочь вам. Спасибо.

Srivenu ответил: 28 апреля 2018 в 09:14

используйте приведенный ниже метод, чтобы получить измененный ключ

public static String getModifiedKey(String strn) {
            String[] r = strn.split("(?=\\p{Upper})");
            String result = "";
            for (String str : r)
                result += str.toLowerCase() + "_";
            return result.substring(0, result.length()-1);
        }

использовать ниже одного для вставки данных

JSONObject.put(getModifiedKey(OriginalKey) , JSONObject.get("OriginalKey"));
EL323 ответил: 28 апреля 2018 в 09:18
Он не изменит ключи JSONArrays
Srivenu ответил: 28 апреля 2018 в 09:26
По моему пониманию, вы пытаетесь заменить все ключи своими собственными ключами. Я дал метод генерации ключа. так это делается. Кроме того, что вы пытаетесь выполнить, дайте мне знать ясно.
EL323 ответил: 28 апреля 2018 в 09:30
да, я пытаюсь заменить все ключи. Когда я говорю заменить все клавиши, я имею в виду все ключи в JSONObject и JSONArray. Ваше решение просто заменит ключи в родительском JSONObject. Но если я передам ключ JSONArray, он даст исключение.