| //------------------------------------------------------------------------------------------------------- | |
| // 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"); | |
| } | |
| 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) | |
| } |