1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58
   | function serialize(j){
	if (j == null)
		return "null";
 
	// pour chaque type de données
	switch(typeof j){
		// si chaine de caractères, on échappe les caractères spéciaux et on entoure la chaine de ""
		case "string":{
			j=j.replace('"', '\"');
			j=j.replace("\n", "\\n");
			j=j.replace("\t", "\\t");
			j=j.replace("\b", "\\b");
			j=j.replace("\f", "\\f");
			j=j.replace("\r", "\\r");
			return '"' + j + '"'; 
		}		
		// si nombre, on écrit simplement la valeur
		case "number":  
			return j;
		case "object":{
			// si tableau, on sépare les éléments par des virgules et on entoure le tout par des crochets
			if (j instanceof Array){
				var result = "[";
				for(var i=0; i<j.length; i++){
					result += serialize(j[i]);
					if (i+1 < j.length)
						result += ",";
				}
				result += "]";
				return result;
			}else{
				// si objet, on sépare les champs par des virgules et on entoure le tout par des accolades
				var result = "{";
				var properties = [];
				var propertyCount = 0;
				for (var prop in j){
					properties[propertyCount] = prop;
					propertyCount ++;
				}
 
				for (var i=0; i<propertyCount; i++){
					result += properties[i] + ':' + serialize(j[properties[i]]);
					if (i+1 < propertyCount)
						result += ',';
				}			
 
				result += "}";
				return result;
			}
		}
		// si booléen on affiche directement la valeur
		case "boolean": 
			return (j)?'true':'false';
		// si objets non sérialisables ou indéfinis (fonction, undefined ...) on renvoie une chaine vide pour garantir l'intégrité de la chaine JSON générée
		default:
			return "";
	}
} | 
Partager