JSON.uts 9.8 KB
Newer Older
杜庆泉's avatar
杜庆泉 已提交
1
import { describe, test, expect,expectNumber, Result } from './tests.uts'
Y
yurj26 已提交
2

杜庆泉's avatar
杜庆泉 已提交
3 4


杜庆泉's avatar
杜庆泉 已提交
5 6 7
type UserJSON={
	id:string;
	name:string|null;
8 9
}

杜庆泉's avatar
杜庆泉 已提交
10
type PersonJSON = {
11 12 13 14 15 16 17 18 19 20 21 22 23 24 25
	/**
	* @JSON_FIELD "a+b"
	*/
	a_b: string;
	/**
	* @JSON_FIELD "a-b"
	*/
	a_b_: number;
	/**
	* @JSON_FIELD "class"
	*/
	_class: boolean;
}


杜庆泉's avatar
杜庆泉 已提交
26

杜庆泉's avatar
杜庆泉 已提交
27

Y
yurj26 已提交
28 29 30 31
export function testJSON() : Result {
    return describe("JSON", () => {
        test('parse', () => {
            const json = `{"result":true, "count":42}`;
32
            const obj = JSON.parse(json) as UTSJSONObject;
Y
yurj26 已提交
33
            expect(obj["count"]).toEqual(42);
lizhongyi_'s avatar
lizhongyi_ 已提交
34
            expect(obj["result"] as boolean).toEqual(true);
Y
yurj26 已提交
35 36 37 38 39 40 41

            const json1 = `{
                "name": "John",
                "age": 30,
                "city": "New York"
              }`;
            const obj1 = JSON.parse(json1);
lizhongyi_'s avatar
lizhongyi_ 已提交
42 43 44 45 46 47
            // expect(obj1).toEqual({
            //     name: 'John',
            //     age: 30,
            //     city: 'New York',
            // });
			expect((obj1! as UTSJSONObject).getString('name')).toEqual("John")
杜庆泉's avatar
杜庆泉 已提交
48 49
			
			
Y
yurj26 已提交
50
            const json2 = '{"string":"Hello","number":42,"boolean":true,"nullValue":null,"array":[1,2,3],"object":{"nestedKey":"nestedValue"}}';
51
            const obj2 = JSON.parse<UTSJSONObject>(json2)!;
lizhongyi_'s avatar
lizhongyi_ 已提交
52 53 54 55 56 57 58 59 60 61
            // expect(obj2).toEqual({
            //     string: 'Hello',
            //     number: 42,
            //     boolean: true,
            //     nullValue: null,
            //     array: [1, 2, 3],
            //     object: {
            //         nestedKey: 'nestedValue',
            //     },
            // });
Y
yurj26 已提交
62 63
            expect(obj2['object']).toEqual({
                nestedKey: 'nestedValue',
lizhongyi_'s avatar
lizhongyi_ 已提交
64 65 66
            })
			expect(obj2.getString("object.nestedKey")).toEqual('nestedValue')
	
杜庆泉's avatar
杜庆泉 已提交
67 68 69 70 71 72 73 74 75 76 77
	
			let json3 = `{"id":"216776999999","name":"小王","grade":1.0,"list":[1,2,3],"address":{"province":"beijing","city":"haidian","streat":"taipingzhuang","other":2},"anyValue":[[null,null]],"obj":{"a":1,"b":false,"c":null},"customClass":{"name":"lisi","age":30},"numList":[1,2,3,null],"list2":[1,2,3,4],"dic":{"1":{"c":[null]}},"dicArr":[{"a":{"c":[null]}},{"b":{"c":1}}]}`
			let obj3 = JSON.parse(json3)! as UTSJSONObject;
			let obj3Address = obj3.getAny("address")!
			console.log(obj3Address)
			expect(obj3Address instanceof UTSJSONObject).toEqual(true)
			let obj3DicArr = obj3.getArray("dicArr")!
			let obj3DicArrFirst = obj3DicArr[0] as UTSJSONObject
			let obj3DicArrFirstA = obj3DicArrFirst['a']
			console.log(obj3DicArrFirstA instanceof UTSJSONObject)
			expect(obj3DicArrFirstA instanceof UTSJSONObject).toEqual(true)
杜庆泉's avatar
杜庆泉 已提交
78 79 80 81
			// 目前仅android 支持,暂不放开
			// let obj3 = JSON.parse<User>(json1);
			// console.log(obj3)
			
Y
yurj26 已提交
82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100
            // const json3 = '["apple","banana","cherry"]';
            // const obj3 = JSON.parse(json3)!;
            // TODO JSON.parse 后数组的类型 无法强转
            // expect(obj3).toEqual(['apple', 'banana', 'cherry']);

            // const json4 = '[1, "two", true, null, {"key": "value"}, ["nested"]]';
            // const obj4 = JSON.parse(json4)!;
            // expect(obj4).toEqual([1, 'two', true, null, { key: 'value' }, ['nested']]);

            // TODO 暂不支持多个参数
            // const json5 = '{"p": 5}';
            // const obj5 = JSON.parse(json5, function (k : string, v : number) : number {
            //     if (k === '') return v;
            //     return v * 2;
            // })!;
            // expect(obj5).toEqual({
            //     p: 10,
            // });

杜庆泉's avatar
杜庆泉 已提交
101

Y
yurj26 已提交
102
            expect(JSON.parse('{}')!).toEqual({});
杜庆泉's avatar
杜庆泉 已提交
103
		
Y
yurj26 已提交
104 105 106
            // TODO 不支持boolean、string,js端需抹平
            // expect(JSON.parse('true')!).toEqual(true);
            // expect(JSON.parse('"foo"')!).toEqual("foo");
107 108 109
            // expect(JSON.parse('null')!).toEqual(null);
			
			const json4 = '{"data":[{"a":"1"},{"a":2},[{"b":true},{"b":"test"}],[1, 2, 3]]}';
lizhongyi_'s avatar
lizhongyi_ 已提交
110 111 112 113 114 115 116
			const obj4 = JSON.parseObject(json4);
			expect(obj4?.getString('data[0].a')).toEqual("1")
			expect(obj4?.getNumber('data[1].a')).toEqual(2)
			expect(obj4?.getBoolean('data[2][0].b')).toEqual(true)
			expect(obj4?.getAny('data[1].a')).toEqual(2)
			expect(obj4?.getJSON('data[2][1]')).toEqual({"b":"test"})   
			expect(obj4?.getArray('data[3]')).toEqual([1, 2, 3])
117

Y
yurj26 已提交
118
        })
杜庆泉's avatar
杜庆泉 已提交
119 120 121 122 123 124 125 126 127 128 129 130 131
		test('parseObject', () => {
		    const json = `{"result":true, "count":42}`;
		    const obj = JSON.parseObject(json);
		    expect(obj!["count"]).toEqual(42);
		    expect(obj!["result"] as boolean).toEqual(true);
		
		    expect(JSON.parseObject('{}')!).toEqual({});
			
			const json1 = `{
			    "name": "John",
			    "id": "30"
			  }`;
			let obj2 = JSON.parseObject<UserJSON>(json1);
lizhongyi_'s avatar
lizhongyi_ 已提交
132
			expect(obj2!.id).toEqual("30");
杜庆泉's avatar
杜庆泉 已提交
133 134 135 136 137
			
			const json2 = `{
			    "id": "30"
			  }`;
			let obj3 = JSON.parseObject<UserJSON>(json2);
lizhongyi_'s avatar
lizhongyi_ 已提交
138
			expect(obj3!.id).toEqual("30");
杜庆泉's avatar
杜庆泉 已提交
139 140 141 142 143 144
			const json3 = `{
			    "name": "John"
			  }`;
			 let obj4 = JSON.parseObject<UserJSON>(json3);
			expect(obj4).toEqual(null);
		})
杜庆泉's avatar
杜庆泉 已提交
145 146 147 148 149 150 151 152 153 154 155
		test('parseArray', () => {
		    const json1 = `[1,2,3]`;
		    const array1 = JSON.parseArray(json1);
			expect(array1).toEqual([1,2,3]);
			
			const json2 = `[1,"hello world",3]`;
			const array2 = JSON.parseArray(json2);
			expect(array2).toEqual([1,"hello world",3]);
			
			
			const json3 = `[{"name":"John","id":"30"},{"name":"jack","id":"21"}]`;
lizhongyi_'s avatar
lizhongyi_ 已提交
156 157
			const array3 = JSON.parseArray<UTSJSONObject>(json3);
			// expect((array3![0])["name"]).toEqual("John");
杜庆泉's avatar
杜庆泉 已提交
158 159
			
		})
lizhongyi_'s avatar
lizhongyi_ 已提交
160
        test('stringify', () => {     
Y
yurj26 已提交
161 162
            const obj = { name: 'John', age: 30 };
            const json = JSON.stringify(obj);
lizhongyi_'s avatar
lizhongyi_ 已提交
163
            // expect(json).toEqual('{"name":"John","age":30}');
Y
yurj26 已提交
164 165

            const obj1 = { name: 'John', age: 30, address: { city: 'New York', country: 'USA' } };
lizhongyi_'s avatar
lizhongyi_ 已提交
166 167
            const json1 = JSON.stringify(obj1);
            // expect(json1).toEqual('{"address":{"country":"USA","city":"New York"},"name":"John","age":30}');
Y
yurj26 已提交
168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184

            const obj2 = ['apple', 'banana', 'cherry'];
            const json2 = JSON.stringify(obj2);
            expect(json2).toEqual('["apple","banana","cherry"]');

            // TODO 暂不支持多个参数
            // const obj3 = { name: 'John', age: '30' };
            // const replacer = (key : string, value : string) : string => (key === 'name' ? value.toUpperCase() : value);
            // const json3 = JSON.stringify(obj3, replacer);
            // expect(json3).toEqual('{"name":"JOHN","age":"30"}');

            // const obj4 = { name: 'John', age: 30 };
            // const json4 = JSON.stringify(obj4, null, 4);
//             expect(json4).toEqual(`{
//     "name": "John",
//     "age": 30
// }`);
lizhongyi_'s avatar
lizhongyi_ 已提交
185
            // expect(JSON.stringify({ x: 5, y: 6 })).toEqual(`{"x":5,"y":6}`);
Y
yurj26 已提交
186 187
            expect(JSON.stringify([3, 'false', false])).toEqual(`[3,"false",false]`);
            expect(JSON.stringify({})).toEqual('{}');
杜庆泉's avatar
杜庆泉 已提交
188 189 190
			expect(JSON.stringify(1002)).toEqual('1002');
			expect(JSON.stringify(1002.202)).toEqual('1002.202');
			expect(JSON.stringify(null)).toEqual('null');
lizhongyi_'s avatar
lizhongyi_ 已提交
191
			// expect(JSON.stringify(100/0.0)).toEqual('null');
Y
yurj26 已提交
192
            expect(JSON.stringify(true)).toEqual('true');
杜庆泉's avatar
杜庆泉 已提交
193
			expect(JSON.stringify(false)).toEqual('false');
杜庆泉's avatar
杜庆泉 已提交
194 195
			//console.log(JSON.stringify('foo'))
            //expect(JSON.stringify('foo')).toEqual('foo');
杜庆泉's avatar
杜庆泉 已提交
196 197
			expect(JSON.stringify(Math.PI)).toEqual('3.141592653589793');
			expect(JSON.stringify(Math.E)).toEqual('2.718281828459045');
杜庆泉's avatar
杜庆泉 已提交
198
			
杜庆泉's avatar
杜庆泉 已提交
199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240
			/**
			 * add since 2023-09-23
			 * 部分出错过的示例场景
			 */
			const arr = [{
				"$method": "collection",
				"$param": ["type"] as Array<any>,
			  }, {
				"$method": "add",
				"$param": [
				  [{
					"num": 2,
					"tag": "default-tag",
				  } as UTSJSONObject, {
					"num": 3,
					"tag": "default-tag",
				  } as UTSJSONObject] as Array<UTSJSONObject>,
				] as Array<any>,
			  }] as Array<UTSJSONObject>
			  let ret = JSON.stringify({
				$db: arr
			  })
			  expect(ret).toEqual('{"$db":[{"$method":"collection","$param":["type"]},{"$method":"add","$param":[[{"num":2,"tag":"default-tag"},{"num":3,"tag":"default-tag"}]]}]}')
				  
			type Msg = {	
				id: string,	
				method: string,	
				params: any
			}
			type CallUniMethodParams = {	
				method : string	
				args : com.alibaba.fastjson.JSONArray
			}
			const msg = `{"id":"6fd6ca73-c313-48ac-ad30-87ff4eba2be8","method":"App.callUniMethod","params":{"method":"reLaunch","args":[{"url":"/pages/index/index"}]}}`
			const jsonRet2 = JSON.parse<Msg>(msg)!
			
			const paramsStr = JSON.stringify(jsonRet2.params)
			expect(paramsStr).toEqual('{"args":[{"url":"/pages/index/index"}],"method":"reLaunch"}')
			const params = JSON.parse<CallUniMethodParams>(paramsStr)!
			console.warn('params', JSON.stringify(params))
			expect(JSON.stringify(params)).toEqual('{"args":[{"url":"/pages/index/index"}],"method":"reLaunch"}')
			
杜庆泉's avatar
杜庆泉 已提交
241
			
杜庆泉's avatar
杜庆泉 已提交
242 243 244 245 246 247 248 249 250 251 252 253 254 255 256
			class Stage {
				$m: string    
				$p: Array<any>    
				constructor(){      
					this.$m = 'test'      
					this.$p = ['type']    
				}  
			}  
			
			const obj22 = {    
				data: [new Stage()] as Array<any>  
			} as UTSJSONObject    
			
			expect(JSON.stringify(obj22)).toEqual('{"data":[{"$m":"test","$p":["type"]}]}')
			
杜庆泉's avatar
杜庆泉 已提交
257 258 259 260 261 262 263 264 265
			type A = {
				inserted: number  
			}
			const str = '{"inserted": 2}'
			const obj33 = JSON.parse<A>(str)!
			console.log('-------------------------');
			console.log(obj33.inserted);
			expectNumber(obj33.inserted).toEqualDouble(2.0)
			expect(JSON.stringify(obj33.inserted)).toEqual("2")
杜庆泉's avatar
杜庆泉 已提交
266
			
267 268 269
        })
	
		test('invalidField', () => {
杜庆泉's avatar
杜庆泉 已提交
270
			let str = "{\"a+b\"	:\"test1\",\"a-b\":2,\"class\":true}"
杜庆泉's avatar
杜庆泉 已提交
271
			let p = JSON.parseObject<PersonJSON>(str)
272 273
			expect(p?._class).toEqual(true)
			expect(p?.a_b).toEqual("test1")
杜庆泉's avatar
杜庆泉 已提交
274
			
275 276 277 278
			
			let retStr = JSON.stringify(p)
			console.log(retStr)    
		})
杜庆泉's avatar
杜庆泉 已提交
279
		
Y
yurj26 已提交
280
    })
杜庆泉's avatar
杜庆泉 已提交
281 282
	
	
Y
yurj26 已提交
283
}