//------------------------------------------------------------------------------------------------------- // Copyright (C) Microsoft. All rights reserved. // Licensed under the MIT license. See LICENSE.txt file in the project root for full license information. //------------------------------------------------------------------------------------------------------- write("\nJ*************************** JSON test parse simple literals ***************"); write(JSON.stringify(JSON.parse("{ \"memberNum\" : -0.1}"))); var rev1 = function(name, value) { write("+++in reviver") // for (a in this) { // write(a) // write(this[a]) // } if (this[name] != value) { write("error"); } write(name); if (value === undefined) { write("undefined"); } else if (value === null) { write("null"); } else { write(value); } write("+++out reviver"); if (value == 3) { return undefined; } else if (value == true) { return 99; } return value; } write(""); write(""); var jsObjString = "{\"\" : 7, \"memberNullFirst\" : null, \"memberNum\" : 3, \"memberNegNum\" : -98765,\"memberStr\" : \"StringJSON\", \"memberBool\" : true , \"memberObj\" : { \"mm\" : 1, \"mb\" : false}, \"memberX\" : {}, \"memberArray\" : [33, \"StringTst\",null,{}], \"memberNull\" : null}"; //var jsObjString = "{\"memberNullFirst\" : null}"; write("\nJ*************************** JSON test parse simple with no reviver ***************"); write(""); write("JSON Parse__ original= "); write(jsObjString); var jsObjStringParsed = JSON.parse(jsObjString); var jsObjStringBack = JSON.stringify(jsObjStringParsed); write(""); write(" __Parsed and stringify back= "); write( jsObjStringBack); write(""); write(""); write("\nJ*************************** JSON test parse simple with tracing reviver ***************"); write(""); write("JSON Parse__ original= "); write(jsObjString); jsObjStringParsed = JSON.parse(jsObjString, rev1); jsObjStringBack = JSON.stringify(jsObjStringParsed); write(""); write(" __Parsed with tracing reviver and stringify back = "); write( jsObjStringBack); write(""); write(""); write("\nJ*************************** JSON test parse simple with data restore reviver ***************"); jsObjString = "{\"\" : 7, \"memberNullFirst\" : null, \"dateMember\" : \"2008-05-30T07:00:59Z\", \"memberNum\" : 3, \"memberStr\" : \"StringJSON\", \"memberBool\" : true , \"memberObj\" : { \"mm\" : 1, \"mb\" : false}, \"memberX\" : {}, \"memberArray\" : [33, \"StringTst\",null,{}], \"memberNull\" : null}"; write(""); jsObjStringParsed = JSON.parse(jsObjString, function(key, value) { var a; if (typeof value === 'string') { a = /^(\d{4})-(\d{2})-(\d{2})T(\d{2}):(\d{2}):(\d{2}(?:\.\d*)?)Z$/.exec(value); if (a) { return new Date(Date.UTC(+a[1], +a[2] - 1, +a[3], +a[4], +a[5], +a[6])); } } return value; } ); jsObjStringBack = JSON.stringify(jsObjStringParsed); write(""); write("JSON Parse__ original= "); write(jsObjString); write(""); write(" __Parsed and stringify back with Date rev = "); write(jsObjStringBack); write("VERIFICATION: restored date year(if this doesn't throw we know the filter worked)= "); write(jsObjStringParsed.dateMember.getUTCFullYear()); var rev2 = function(name, value) { if (this[name] != value) { write("error " + this[name] + " != " + value); } if (value == 3.14) { return undefined; } else if (value == true) { return 99; } return value; } write(""); write(""); write("\nJ*************************** JSON test parse simple with reviver2: replace(delete) 3.14 by undefined, replace'true' by 99 ***************"); write(""); jsObjStringParsed = JSON.parse(jsObjString, rev2); jsObjStringBack = JSON.stringify(jsObjStringParsed); write(""); write("JSON Parse__ original= "); write(jsObjString); write(""); write(" __Parsed with reviver2 and stringify back= "); write(jsObjStringBack); var num = 12345; var bfalse = false; var jundef; function f() { return 0; } var arrSimple = new Array(); arrSimple[0] = "document.location"; arrSimple[1] = "foolish"; var simpleObj = { MemberNo1: '"data"' }; simpleObj.dateMember = new Date(2008, 3, 1); simpleObj.functionMember = f; simpleObj.nullMember = null; simpleObj.undefinedMember = jundef; simpleObj.stringmember = "this string ends the obj. You should not see functionMember and undefinedMember"; var simpleObjN = { MemberNo1: '"data"' }; simpleObjN.dateMember = new Date(2008, 3, 1); simpleObjN.functionMember = f; simpleObjN.nullMember = null; simpleObjN.arr = arrSimple; simpleObjN.undefinedMember = jundef; simpleObjN.nested = { nestedM1: {}, nestedM2: 1234, nestedM3: { a: true, b: false} }; simpleObjN.a = { a: {}, nestedM2: 1234, b: { a: true, b: false, c : 3.14} }; simpleObjN.stringmember = "this string ends the obj. You should not see functionMember and undefinedMember"; var objNull = null; var objArrMem = new Object(); objArrMem.intMember = 3; objArrMem.strMember = "string_member_in_object"; var arr = new Array(); arr[0] = "document.location"; arr[1] = "foolish"; arr[2] = 12.3; arr[3] = new Date(2008, 9, 9); arr[4] = new Object(); arr[6] = objArrMem; arr[7] = objNull; arr[8] = jundef; arr[9] = f; arr[10] = new Array(); arr[10][0] = "NestedArray_1stParamString"; arr[10][1] = 3.14; arr[10][2] = { a: "nested object in array", c: true }; arr[10][4] = new Array(); arr[11] = "[0]-document.location, [1]-string, [2]-number, [3]-date, [4]-empty obj, [5]-missing, [6]-obj, [7]-null, [8]-undef, [9]-function, [10]-nestedArray, [11]-this"; function repf(key, value) { if (key == "a" && (this.b != undefined)) { return this.b; } return value; } var objectArray = [ { obj: "SampleTest", desc: "String simple" }, { obj: 1, desc: "Number(1)" }, { obj: num, desc: "Number(1234)" }, { obj: 3.14, desc: "Number(3.14)" }, { obj: Number.NaN, desc: "Number(NaN)" }, { obj: Number.POSITIVE_INFINITY, desc: "Number(POSITIVE_INFINITY)" }, { obj: true, desc: "bool(true)" }, { obj: bfalse, desc: "bool(false)" }, { obj: null, desc: "null" }, { obj: jundef, desc: "undefined" }, { obj: new Date(2008, 10, 10), desc: "Date(2008, 10, 10)" }, { obj: new Object("hello"), desc: "string in Object" }, { obj: new Number(33), desc: "number in Object" }, { obj: new Object(true), desc: "bool in Object" }, { obj: simpleObj, desc: "SimpleObject" }, { obj: simpleObjN, desc: "Object with nested objects and array" }, { obj: arrSimple, desc: "Simple array" }, { obj: arr, desc: "Complex array" } ]; var replacerArray = [ { obj: null, desc: "null" }, { obj: [], desc: "array replacer: []" }, { obj: ["a", "b"], desc: "array replacer: [\"a\",\"b\"]" }, { obj: ["a", "b", "a", "a"], desc: "array replacer: [\"a\",\"b\",\"a\",\"a\"]" }, { obj: repf, desc: "replacer function, if the key is 'a' and the holder has a prop 'b', replace the value of the prop 'a' with the value of prop b " } ] var spaceArray = [ { obj: null, desc: "null" }, { obj: 4, desc: "number 4" }, { obj: 24, desc: "number 24" }, { obj: "........................", desc: "string : ........................" } ] var stringifiedObj; var parsedObj; var reStringified; write(""); write(""); write("\n%%%%%%%%%%%%%%%%% Matrix Testing %%%%%%%%%%%%%%%%% "); write(""); write(""); write("\nJ*************************** JSON test stringify - simple, no space, not replacer *********************** "); for (var i = 0; i < objectArray.length; i++) { try { write(""); write("------ JSON test stringify: " + objectArray[i].desc + " ------"); stringifiedObj = JSON.stringify(objectArray[i].obj); write(stringifiedObj); parsedObj = JSON.parse(stringifiedObj); reStringified = JSON.stringify(parsedObj); write("=== Parsed and restringified :") write(reStringified); parsedObj = JSON.parse(stringifiedObj, rev2); reStringified = JSON.stringify(parsedObj); write("=== Parsed with reviver and restringified :") write(reStringified); } catch (e) { write("!!Exception: " + e); } } function checkStrEqual(str1, str2) { if (str1 === str2) { write("PASS"); } else { write("FAIL"); write(str1); write(str2); } } var complexStr = "/test ze\0ro\vString\n_u4:\u0061_u2:\xbc_u1:\x0e_u2clean:\x8f"; var expectedString = "\"/test ze\\u0000ro\\u000bString\\n_u4:a_u2:¼_u1:\\u000e_u2clean:\\""; write(""); write("------ JSON test stringify: complex string ------"); stringifiedObj = JSON.stringify(complexStr); checkStrEqual(stringifiedObj, expectedString); parsedObj = JSON.parse(stringifiedObj); reStringified = JSON.stringify(parsedObj); write("=== Parsed and restringified :") checkStrEqual(reStringified, expectedString); parsedObj = JSON.parse(stringifiedObj, rev2); reStringified = JSON.stringify(parsedObj); write("=== Parsed with reviver and restringified :") checkStrEqual(reStringified, expectedString); for (var k = 0; k < replacerArray.length; k++) { for (var j = 0; j < spaceArray.length; j++) { write(""); write(""); write("\n*************************** JSON test stringify: replacer: " + replacerArray[k].desc + " space: " + spaceArray[j].desc + " *********************** "); for (var i = 0; i < objectArray.length; i++) { try { write(""); write("------ JSON test stringify: " + objectArray[i].desc + " ------"); stringifiedObj = JSON.stringify(objectArray[i].obj, replacerArray[k].obj, spaceArray[j].obj); write(stringifiedObj); parsedObj = JSON.parse(stringifiedObj); reStringified = JSON.stringify(parsedObj); write("=== Parsed with no reviver and restringified :") write(reStringified); parsedObj = JSON.parse(stringifiedObj, rev2); reStringified = JSON.stringify(parsedObj); write("=== Parsed with reviver2 and restringified :") write(reStringified); } catch (e) { write("!!Exception: " + e); } } write(""); write("------ JSON test stringify: complex string 2 ------"); stringifiedObj = JSON.stringify(complexStr, replacerArray[k].obj, spaceArray[j].obj); checkStrEqual(stringifiedObj, expectedString); parsedObj = JSON.parse(stringifiedObj); reStringified = JSON.stringify(parsedObj); write("=== Parsed with no reviver and restringified :") checkStrEqual(reStringified, expectedString); parsedObj = JSON.parse(stringifiedObj, rev2); reStringified = JSON.stringify(parsedObj); write("=== Parsed with reviver2 and restringified :") checkStrEqual(reStringified, expectedString); } } function write(a) { if (this.WScript == undefined) { document.write(a); document.write("\n"); } else WScript.Echo(a) }