Frage Warum verhält sich Json so komisch?


Gibt es irgendwelche Reservewörter für JSON als KEY?

meine Json Struktur ist

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());

AUSGABE:

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

Also das Problem ist, warum mein Json sich auf eine seltsame Weise benimmt.
Ich habe "Klasse" nicht als Variablennamen definiert, es ist nur ein Schlüssel.

Problem ist, wenn ein Argument wie gegeben wird, "Klasse" ist ein Schlüssel oder reservieren Wort dann Wie Ich habe erfolgreich eingefügt Line#2und wenn es einfügbar in DimObject dann warum es in finalObject nicht einfügen.

Bitte hilf mir, dieses Geheimnis zu lösen

GENAUER CODE ::

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
2018-01-21 18:04


Ursprung


Antworten:


Um Ihrer Beobachtung zu folgen, folgt JSON JavaScript (oder ECMAScript, wie es genannt werden sollte) reservierte Wörter und Klasse Ist einer von ihnen.

BEARBEITEN:

Bei der Verwendung von JavaScript scheint es möglich, dass Sie reservierte Wörter in Anführungszeichen verwenden können. Ich habe es wie folgt getestet:

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

Es ist auch interessant, ich bin immer noch verwirrt über das Problem. Mit JSON verwende ich alle meine Techniken mit Javascript, so kann ich nicht die gleichen Ergebnisse erzielen wie Sie können.

Ich habe die Quelldatei gefunden JSONObject.java beim Diese Internetseite


4
2018-01-21 18:18



Bearbeiten: In Ihrem Beispiel schreiben Sie Code in Java. Ich weiß nicht, welche Java-Implementierung von JSON Sie verwenden, aber es ist wahrscheinlich nicht streng. Es ist nicht als JavaScript-Interpreter oder Engine gedacht, es hindert Sie also nicht daran, etwas zu tun, was Sie nicht tun sollten. Aus diesem Grund können Sie den "Klassenschlüssel" hinzufügen, wie Sie es taten - die Java-Seite wird Ihnen erlauben, das zu tun, obwohl es falsch ist. Es wird nicht überprüft, ob Sie Keywords als Bezeichner verwenden. Wenn dieser JSON von einem Webbrowser interpretiert wird, nachdem er die Java-Welt verlassen hat, werden Sie Probleme haben, denn dieses "Klassen" -Wort hat jetzt eine besondere Bedeutung.

class ist ein reserviertes Wort. Sie sollten es vermeiden, es als Variablennamen zu verwenden. Sehen Hier für eine Liste reservierter Wörter.

Mit der JavaScript-Konsole von Chrome kann ich sie als Bezeichner verwenden. IE8 verhält sich anders. Ich kann es nicht in Punktnotation verwenden, aber ich kann es mit Klammernnotation verwenden. Sehen a.class und a['class'] im Folgenden.

>>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"

Der Punkt ist, verwende reservierte Wörter nicht als Identifikatoren. Sie werden wahrscheinlich nicht die Ergebnisse erhalten, die Sie erwarten.


2
2018-01-21 18:21



der Grund, den JSON verwendet { "double quotes":"around key/vals" } Aus genau diesem Grund - um reservierten Wörtern zu entgehen.

das sagte, wenn Sie bekommen gültig JSON, es sollte keine Probleme geben, da reservierte Wörter von der "double quotes"...

Ich habe bemerkt, dass du ein Zitat in dieser Zeile hast:

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

sollte sein "supplier". Gibt es das überhaupt, könntest du das ändern? oder wird es automatisch generiert?


1
2018-01-27 09:54



Ich denke nicht, dass Ihr minimales Beispiel das Problem, dem Sie ausgesetzt sind, korrekt reproduziert.

Benutzung der json java Bibliothek von json.deIch habe diesen Java-Code ausgeführt:

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

und die Ausgabe war wie erwartet:

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

1
2018-01-29 14:07