Jan 22
toJSONString() anywhere
Nicholas C. Zakas, autor do livro “Professional Javascript” da Wrox e atualmente trabalhando no Yahoo! como Frontend Engineer (My Yahoo!) é mais um dos que tem alguma coisa a reclamar quando o assunto é EcmaScript 4 (Javascript 2.0). Uma das premissas da nova linguagem é a integração do JSON como formato de dados padrão da linguagem, segundo a especificação do E4X um tipo Object terá o método toJSONString(), o que pode parecer inteligente a primeira vista mas como Object é a base para todos os outros tipos nativos as funções de serialização seriam adicionadas mesmo a tipos onde seriam totalmente inúteis. Onde está a vantagem de serializar um tipo Date ou Regex para JSON?
Obviamente a funcionalidade de serialização como todas as funcionalidades de suporte devem ser providas por uma interface externa, esse é um conceito fundamental e não existe nenhum motivo prático para ser diferente disso.
Um ponto interessante levantado pelo próprio Nicholas é que nunca houve nas especificações anteriores do EcmaScript qualquer referência a um formato de dados padrão, nem mesmo suporte nativo a XML foi adicionado em nenhum momento, então porque tentar empurrar JSON para dentro da linguagem? O correto é prover recursos para que JSON, XML e qualquer outro formato que venha a surgir sejam integrados da forma mais transparente possível, mesmo que por meio de bibliotecas.
Melhor do que apenas jogar pedras é sugerir uma solução melhor, Zakas postou em seu site pessoal a implementação da JSONLib, um modelo contendo 2 classes simples, uma para objetos JSON e outra para uma coleção de objetos JSONList.
1 - The addition of two new global types: JSON and JSONList. JSON represents a JSON object while JSONList represents a JSON array.
2 - Both types have a toJSONString() method that correctly encodes an object into a JSON string. The default toString() method is available but returns a string representation of the object (not a JSON string). This follows the convention set forth in E4X.
3 - The [[Put]] method is overridden in both types such that it will only accept values of type JSON, JSONList, Date, boolean, string, number, or null. Any other data types cause an error to be thrown.
4 - The JSON constructor allows an object to be passed in that has initial properties to add; the JSONList constructor allows an array to be passed in with items to add.
5 - The typeof operator should return “json” when used on a value of type JSON or JSONList.
6 - JSON strings are parsed via JSON.parse(), throwing syntax errors if they are found.
Exemplos simples de implementação:
var obj = JSON.parse(”{\”name\”:\”Nicholas\”,\”age\”:29}”);
var json = new JSON();
json.put(”name”, “Nicholas”);
json.put(”age”, 29);
var name = json.get(”name”);
var str = json.toJSONString();var list = new JSONList();
list.put(0, “blah”);
list.push(25);
list.push(true);
var val = list.get(1);
var len = list.getLength();
var str = list.toJSONString();var json = new JSON({name:”Nicholas”});
var name = json.get(”name”);var list = new JSONList([1, 2, 3, 4]);
var val = list.get(2);
list.push(function(){}); //throws error
O artigo original pode ser visto em:
http://nczonline.net/archive/2008/1/537

