Y a-t-il des mots de réserve pour JSON comme une clé?
My JSON STRUCTURE est P>
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;
}
}
4 Réponses :
Quant à suivre votre observation, JSON suit JavaScript (ou ECMAScript, comme il convient de l'appeler) des mots réservés et classe em> est l'un d'entre eux. aussi intéressant, je suis toujours perplexe par le problème. Avec JSON, j'utilise toutes mes techniques avec JavaScript, je ne peux donc pas produire les mêmes résultats que possible. P> J'ai trouvé le fichier source pour JSONObject.java à ce site p> p> Edit: h3> < p> En faisant un dabonnement avec JavaScript, il semble que vous puissiez utiliser des mots de réserve entre guillemets, je l'ai testé comme suit: p>
Mais le problème est que j'ai été Bale pour insérer le mot en ligne n ° 2 ??
Je détesterais laisser cette question avec Eh bien, cela aurait pu être un problème i> remarque, mais avez-vous essayé de simuler les données et d'obtenir les mêmes résultats à chaque fois? Il est inséré dans dimobject code> mais pas finalObject code>? Ou c'est arrivé une fois, vous n'avez pas encore essayé?
ya ... J'ai utilisé le débogueur pendant plusieurs fois (heures) et surveillait chaque ligne de très près
@Anthony Forloney :: Thnax pour la réponse, sera à la recherche de FRWD à votre réponse
@Antthony ForLoney :: Bien que votre quatrième cas a l'air intéressant, je suppose que ma réponse est devenue là où l'intérieur du cas # 4.. on voudrait voir votre plus de commentaires pour connaître la raison exacte.
Votre cas serait différent, puisque votre valeur i> est ["a", "b", "c"] i> ce qui n'est pas un mot clé, le mien était. Mais, le mot clé fonctionne lorsqu'il est mis avec des citations. J'ai regardé le Mettez la méthode code> à l'intérieur de JSONOBJECT.JAVA B> Vous pourriez avoir un problème dans lequel elle interprète la valeur de la chaîne étant transmise, cela pourrait ne pas l'interpréter comme "Classe" I> en JavaScript, mais plutôt classe i> mais c'est ma devinette sauvage, je dois admettre que je suis exclu.
Je ne vois rien dans jsonobject.java qui traiterait "classe" code> comme autre chose qu'une chaîne, ou même toute autre raison pour laquelle elle échoue ... bien que le attrape (exception) e) {retour nul; } code> est inquiétant, je ne peux pas le voir échouer et produire ce résultat.
@bobince, cela n'a aucun sens pour moi, peut-être de Java à JavaScript, quelque chose se perd de la traduction.
Eh bien, il n'y a pas d'élément JavaScript au problème si votre finalObject.tostring () code> n'incluait pas la propriété Classe Code>! (Les chaînes JSON sont délibérément citées pour éviter les mots réservés; vous pouvez toujours avoir des problèmes avec des noms de clés qui sont également des propriétés d'objet JS comme Tostring code> dans IE, mais ce n'est pas en cause ici.)
@Bobince: Oui, je suis également allé à travers le Jsonobject.java, n'a pas été en mesure de trouver une raison de traiter "la classe" comme autre chose qu'une chaîne,
@Bobince: "Test Vidon statique (Objet O)" est approprié dans ce cas
Est-ce que le problème est là où près de ce constructeur :::: public JSONObject () {this.map = nouveau hashmap (); }
edit fort>: dans votre exemple, vous écrivez le code en Java. Je ne sais pas quelle implémentation Java de JSON utilisez-vous, mais ce n'est probablement pas strict. Ce n'est pas censé être un interprète ou un moteur JavaScript, il ne vous empêche donc pas de faire quelque chose que vous ne devriez pas faire. C'est pourquoi vous pouvez ajouter la clé "Classe" comme vous l'avez fait - le côté Java va vous laisser faire cela même si c'est faux. Cela ne vérifie pas que vous n'utilisez pas de mots-clés comme identifiant. Lorsque JSON est interprété par un navigateur Web après avoir quitté le monde Java, vous aurez des problèmes, car maintenant que le mot "classe" a une signification particulière. La console JavaScript de Chrome m'a laissé l'utiliser comme identifiant. IE8 se comporte différemment. Je ne peux pas l'utiliser dans la notation de points, mais je peux l'utiliser avec la notation de support. Voir Le point est, Don ' t Utilisez des mots réservés comme identifiant. Vous n'obtiendrez probablement pas les résultats que vous attendez. P> p> classe code> est un mot réservé. Vous devez éviter d'utiliser comme nom de variable. Voir ici pour une liste de mots réservés. P> a.class code> et ["classe"] code> dans ce qui suit. P>
Ya j'ai eu ton point et j'accepte cela aussi, mais le problème est pourquoi ma production était incohérente?
Parce que vous utilisez un mot-clé comme identifiant.
@Jon :: Ya je suis d'accord avec votre point, la chose qui fabriquée est non instable, c'est comment elle a réussi à la ligne n ° 2 (je ne suis pas dérangé comme pourquoi il a échoué à la ligne 7), je prends votre point que c'est un mot clé et je devrais pas utilisé ce mot
Il n'y a pas de mots réservés dans Json Cause contrairement à JavaScript, JSON nécessite que les clés soient citées. Voir la spécification.
@Tomas aucune querelle là-bas, mais je me demande si la mise en œuvre d'un navigateur ou de la bibliothèque ou de la traduction de JSON en tant qu'objets JavaScript découvrira des problèmes tels que l'auteur de la question vécue?
La raison pour laquelle JSON utilise Cela dit, si vous obtenez Valid em> JSON, il ne devrait y avoir aucun problème, car les mots réservés seront échappés par le J'ai remarqué que vous avez un Citation dans cette ligne: p> doit être {"Double citations": "autour de Key / Vals"} code> est pour cette raison exacte - d'échapper à des mots réservés. "Double citations" Code> ... P> "fournisseur" code>. Y a-t-il de toute façon que vous pourriez changer cela? ou est-ce généré automatiquement? p> p>
@Dan: Hé, désolé, c'était une erreur de frappe, j'ai corrigé cela.
Pourquoi le bowvote ...? "Y a-t-il des mots de réserve pour Json comme une clé?" - La réponse est non.
-1 Comme il ne s'agissait pas de la question, et votre commentaire ci-dessus est une très petite réponse de la question, vous n'avez pas parlé du comportement mystérieux du JSON
Il échappe aux mots réservés en utilisant "Double citations" Code>, il n'y a vraiment pas beaucoup plus que ça ...
+1 Comme la plupart des autres semblent manquer le point important qu'il n'y a pas de mot réservé à Json.
Je ne pense pas que votre exemple minimal reproduit correctement le problème que vous rencontrez.
Utilisation de la bibliothèque JSON Java de JSON.ORG , j'ai couru ce code Java: p>
dimObject#{"name":"sam","class":["A","B","c"]}
finalObject#{"supplier":{"name":"sam","class":["A","B","c"]}}
Avez-vous essayé de renommer classe i> à quelque chose comme classvar i> pour tester s'il s'agit d'un mot-clé réservé? Également remarqué dans Line5 # B> ne devrait-il pas être "= nouveau JSONObject ();" Sauf si ce n'est pas un code exact de copie / collé et que vous avez rapidement tapé cela comme un simple visuel.
Désolé, ce n'est pas un code exact de copier, son code juste un code tapé rapide, il peut donc avoir une erreur d'erreur comme étant la codage de l'IDE après une longue période :( ,? Ya j'ai essayé de renommer "la classe" à "Test123 "Tout en insérant au finalObject, le résultat était très attendu, était capable d'insérer" TEST123 "dans FinalObject
Que diriez-vous de montrer le code réel que vous utilisez depuis ce qui précède n'est pas valide Java et n'est-ce pas JavaScript.
@ jhon, j'ai édité, maintenant son code exact ...
Lorsque le comportement mystérieux se produit, vous imprimez
finalObject code> sur le navigateur ou dans la console Java?@Antthony Forloney :: Ya J'ai utilisé du débogueur NetBeans à plusieurs reprises et encore, afin de régler mon auto avec le problème, mais n'a pas pu être réglé ...
Même ceci fonctionne [Code] Classe publique NewClass {Public Static Void Main (String [] AR) {Map = Nouveau HASHMAP (); map.put ("classa", "classe"); System.out.print (carte.tostring ()); }} [/ code]
Pouvez-vous utiliser des instructions d'impression de débogage dans la zone de votre code pour voir si des sorties et / ou quelles valeurs sont attribuées à, peut-être votre écrasement à l'objet lors de la pose dans
finalObject code> ou quelque chose n'est pas réglé correctement?