Почему json ведет себя этим странным способом?

Есть ли какие-либо резервные слова для JSON как КЛЮЧ?

моя структура Json

dimObject{String:String}
finalObject(String:dimObject}

Line1# JSONObject dimObject=new JSONObject()
Line2# dimObject.put("class",["A","B","c"]);
Line3# dimObject.put("name",["sam"]);
Line4# System.out.print("dimObject#"+dimObject.toString());
Line5# JSONObject finalObject=new new JSONObect();
Line6# finalObject("supplier",dimObject);
Line7# System.out.print("finalObject#"+finalObject.toString());

ВЫВОД:

dimObject#{"class":["A","B","c"],"name":["sam"]}
finalObject#{"supplier":{"name":["sam"]}}

Таким образом, проблема состоит в том, почему мой json ведет себя странным способом.
Я не определил "класс" как имя переменной, это - просто Ключ.

Проблема, если как аргумент дают, "класс" является ключевым или резервным словом затем, как я успешно вставил в Line#2, и если его вставка, которая в состоянии в dimObject затем, почему его не вставляют способный в finalObject.

Помогите мне решающий эту тайну

ТОЧНЫЙ КОД::

public JSONObject getRequiredAttributesWithValues() {
        List<UserConstraint> constraintList = new ArrayList<UserConstraint>();
        Map<String, FactTableOptimizingInfo> factTableMap = MappingInfo.INSTANCE.
                getFactTableUserNameToFactTableOptimizingInfoMap();
        Map<String, DimensionTableInfo> dimTableMap = MappingInfo.INSTANCE.getDimTableRealNameToObjectMap();
        JSONObject requiredAttributes = getRequiredAttributes();
        JSONObject finalObject = new JSONObject();
        for (Object dimName : requiredAttributes.keySet()) {
            JSONObject dimObject = new JSONObject();
            JSONArray colNames = requiredAttributes.getJSONArray((String) dimName);
            for (Object colName : colNames) {
                List<String> columnList = new ArrayList<String>();
                String dimensionName = (String) dimName;
                String columnName = (String) colName;
                constraintList = new ArrayList<UserConstraint>();
                for (FilterDataStructure filter : this.info.getGlobalFilterList()) {
                    if (filter.getDimName().equals(dimensionName)) {
                        if (filter.getColumnName().equals(columnName)) {
                            AtomicConstraint.ConstraintType type;
                            try {
                                Integer.parseInt(filter.getValue());
                                type = AtomicConstraint.ConstraintType.INTEGER_TYPE;
                            } catch (NumberFormatException e) {
                                type = AtomicConstraint.ConstraintType.STRING_TYPE;
                            }
                            UserConstraint constraint = new UserAtomicConstraint(dimensionName, columnName, 
                                                        AtomicConstraint.getStringToOperator(filter.getOperator()),
                                                        filter.getValue(), type, factTableMap, dimTableMap);
                            constraintList.add(constraint);
                        }
                    }
                }

                columnList.add(columnName);
                List<UserDimensionInfoToBuildQuery> dimList = new ArrayList<UserDimensionInfoToBuildQuery>();
                UserTableAndColInfo groupByInfo = new UserTableAndColInfo(dimensionName, columnName);
                ArrayList<UserTableAndColInfo> groupByInfoList = new ArrayList<UserTableAndColInfo>();
                groupByInfoList.add(groupByInfo);

                UserDimensionInfoToBuildQuery dim = new UserDimensionInfoToBuildQuery(dimensionName, columnList);
                dimList.add(dim);
                UserInfoToBuildQuery.Builder queryBuilder = new UserInfoToBuildQuery.Builder(dimList).
                        groupBy(groupByInfoList);
                if (constraintList != null && !(constraintList.isEmpty())) {
                    if (constraintList.size() > 1) {
                        queryBuilder = queryBuilder.constraints(new UserComplexConstraint(constraintList,
                                ComplexConstraint.Joiner.AND));
                    } else {
                        queryBuilder = queryBuilder.constraints(constraintList.get(0));
                    }
                }
                List<Object> result = (List<Object>) DataAccessor.getData(queryBuilder.build());
                if (result == null) {
                    continue;
                }
                JSONArray valueArray = new JSONArray();

                for (Object row : result) {
                    List<Object> splitRow = (List<Object>) row;
                    valueArray.add(splitRow.get(0).toString());
                }
                dimObject.put(colName, valueArray);
            }
            finalObject.put(dimName, dimObject);
        }
        return finalObject;
    }
}
7
задан Adam Lear 20 December 2011 в 05:10
поделиться

4 ответа

, что касается вашего наблюдения Json JSON следует за JavaScript (или ECMAScript, как оно должно быть вызвано) зарезервированные слова и класс является одним из них.

Отредактируйте:

Во время промасти на JavaScript, кажется, вы можете использовать резервные слова в кавычках, я проверил его следующим образом:

myObj = {"class" : "Analysis of Algorithms"}; // <--works
myObj = { class  : "Analysis of Algorithms"}; //  <--works
myObj = { class  : "class"}; // <--works
myObj = {"class" :  class }; // <--does not work.

Также это интересно, я все еще озадачен проблемой. С JSON я использую все свои методы с JavaScript, поэтому я не могу производить те же результаты, сколько сможешь.

Я нашел исходный файл для jsonobject.java в этого веб-сайта

4
ответ дан 7 December 2019 в 05:23
поделиться

Редактировать : В вашем примере вы пишете код в Java. Я не знаю, какую реализацию Java Json вы используете, но это, вероятно, не строги. Не предназначено, чтобы быть переводчиком или двигателем JavaScript, поэтому не мешают вам делать то, что вы не должны делать. Вот почему вы можете добавить ключ «класс», как вы сделали, - на стороне Java даст вам это сделать, хотя это неправильно. Не проверяется, чтобы убедиться, что вы не используете ключевые слова в качестве идентификаторов. Когда JSON интерпретируется веб-браузером после того, как он покинул мир Java, у вас возникнут проблемы, потому что теперь это слово «класс» имеет особое значение.

класс - зарезервированное слово. Вы должны избегать использования его в качестве имени переменной. Смотри здесь для списка зарезервированных слов.

Chrome's JavaScript Console Позвольте мне использовать его в качестве идентификатора. IE8 ведет себя по-разному. Я не могу использовать его в нотации DOT, но я могу использовать его с помощью нотации кронштейна. См. A.Class и A ['класс'] в следующем.

>>var class = "1"
  "Expected identifier"
>>var a = "1"
undefined
>>a
"1"
>>class
  "Syntax error"
>>var a = {}
undefined
>>a["foo"] = "1"
"1"
>>a["class"] = "2"
"2"
>>a.class
  "Expected identifier"
>>a.foo
"1"
>>a['foo']
"1"
>>a['class']
"2"

Точка в том, что не используйте зарезервированные слова в качестве идентификаторов. Вы, вероятно, не получите результаты, которые вы ожидаете.

2
ответ дан 7 December 2019 в 05:23
поделиться

Я не думаю, что ваш минимальный пример правильно реплицирует проблему, которую вы испытываете.

Использование библиотеки JSON Java из JSON.ORG , я запустил этот код Java:

public static void main(String[] args) throws JSONException {
    JSONObject dimObject=new JSONObject();
    dimObject.put("class",new JSONArray(new String[] {"A","B","c"}));
    dimObject.put("name", "sam");
    System.out.println("dimObject#"+dimObject.toString());
    JSONObject finalObject=new JSONObject();
    finalObject.put("supplier",dimObject);
    System.out.println("finalObject#"+finalObject.toString());
}

и вывод был, как и ожидалось:

dimObject#{"name":"sam","class":["A","B","c"]}
finalObject#{"supplier":{"name":"sam","class":["A","B","c"]}}
1
ответ дан 7 December 2019 в 05:23
поделиться

причина, по которой JSON использует {"двойные кавычки": "вокруг ключа/вал" }, именно по этой причине - для избежания зарезервированных слов.

, при этом, если вы получаете действительный JSON, не должно быть никаких проблем, так как любые зарезервированные слова будут экранированы "двойными кавычками"....

Я заметил, что в этой строке отсутствует кавычка:

finalObject#{"supplier:{"name":["sam"]}}

должно быть "supplier" . Вы можете это изменить или это автогенерируется?

.
1
ответ дан 7 December 2019 в 05:23
поделиться
Другие вопросы по тегам:

Похожие вопросы: