json: custom json field names with "[json:field_name]"
							parent
							
								
									7086547471
								
							
						
					
					
						commit
						e39cb41d6b
					
				|  | @ -85,15 +85,17 @@ string res = tos2(""); | |||
| 		if field.attr == 'skip' { | ||||
| 			continue | ||||
| 		} | ||||
| 		 | ||||
| 		name := if field.attr.starts_with('json:') { | ||||
| 			field.attr.right(5) | ||||
| 		} else { | ||||
| 			field.name | ||||
| 		} | ||||
| 		field_type := p.table.find_type(field.typ) | ||||
| 		name := field.name | ||||
| 		_typ := field.typ.replace('*', '') | ||||
| 
 | ||||
| 		enc_name := js_enc_name(_typ) | ||||
| 
 | ||||
| 		if field.attr == 'raw' { | ||||
| 			dec += ' /*prim*/ res->$name = tos2(cJSON_PrintUnformatted(js_get(root, "$field.name")));\n' | ||||
| 			dec += ' res->$field.name = tos2(cJSON_PrintUnformatted(' + | ||||
| 				'js_get(root, "$name")));\n' | ||||
| 			 | ||||
| 		} else { | ||||
| 			// Now generate decoders for all field types in this struct
 | ||||
|  | @ -103,16 +105,15 @@ string res = tos2(""); | |||
| 			dec_name := js_dec_name(_typ) | ||||
| 
 | ||||
| 			if is_js_prim(_typ) { | ||||
| 				dec += ' /*prim*/ res->$name = $dec_name(js_get(root, "$field.name"))' | ||||
| 				// dec += '.data'
 | ||||
| 				dec += ' res->$field.name = $dec_name(js_get(' + | ||||
| 					'root, "$name"))' | ||||
| 			} | ||||
| 			else { | ||||
| 				dec += ' /*!!*/ $dec_name(js_get(root, "$field.name"), & (res->$name))' | ||||
| 				dec += ' $dec_name(js_get(root, "$name"), & (res->$name))' | ||||
| 			} | ||||
| 			dec += ';\n' | ||||
| 		} | ||||
| 
 | ||||
| 		enc += '  cJSON_AddItemToObject(o,  "$name", $enc_name(val.$name)); \n' | ||||
| 		enc += '  cJSON_AddItemToObject(o,  "$name",$enc_name(val.$field.name)); \n' | ||||
| 	} | ||||
| 	// cJSON_delete
 | ||||
| 	//p.cgen.fns << '$dec return opt_ok(res); \n}'
 | ||||
|  |  | |||
|  | @ -645,6 +645,10 @@ fn (p mut Parser) struct_decl() { | |||
| 		if p.tok == .lsbr { | ||||
| 			p.next() | ||||
| 			attr = p.check_name() | ||||
| 			if p.tok == .colon { | ||||
| 				p.check(.colon) | ||||
| 				attr += ':' + p.check_name() | ||||
| 			} | ||||
| 			p.check(.rsbr) | ||||
| 		} | ||||
| 		if attr == 'raw' && field_type != 'string' { | ||||
|  |  | |||
|  | @ -1,16 +1,18 @@ | |||
| import json | ||||
| 
 | ||||
| struct User { | ||||
| 	age  int | ||||
| 	nums []int | ||||
| 	age       int | ||||
| 	nums      []int | ||||
| 	last_name string [json:lastName] | ||||
| } | ||||
| 
 | ||||
| fn test_parse_user() { | ||||
| 	s := '{"age": 10, "nums": [1,2,3]}' | ||||
| 	s := '{"age": 10, "nums": [1,2,3], "lastName": "Johnson"}' | ||||
| 	u := json.decode(User, s) or { | ||||
| 		exit(1) | ||||
| 	} | ||||
| 	assert u.age == 10 | ||||
| 	assert u.last_name == 'Johnson' | ||||
| 	assert u.nums.len == 3 | ||||
| 	assert u.nums[0] == 1 | ||||
| 	assert u.nums[1] == 2 | ||||
|  |  | |||
		Loading…
	
		Reference in New Issue