golang 用 Unmarshal 和 marshal 函数就行了。
仓颉要写这个一大堆,有人反馈这个写法跟 C++有的一拼,但是性能不如 java,go ,c++。
希望官方能优化一下,对初学者友好。
下面是官网的例子。
import serialization.serialization.* import encoding.json.* class Person <: Serializable<Person> { var name: String = "" var age: Int64 = 0 var loc: Option<Location> = Option<Location>.None public func serialize(): DataModel { return DataModelStruct().add(field<String>("name", name)).add(field<Int64>("age", age)).add(field<Option<Location>>("loc", loc)) } public static func deserialize(dm: DataModel): Person { var dms = match (dm) { case data: DataModelStruct => data case _ => throw Exception("this data is not DataModelStruct") } var result = Person() result.name = String.deserialize(dms.get("name")) result.age = Int64.deserialize(dms.get("age")) result.loc = Option<Location>.deserialize(dms.get("loc")) return result } } class Location <: Serializable<Location>{ var country: String = "" var province: String = "" public func serialize(): DataModel { return DataModelStruct().add(field<String>("country", country)).add(field<String>("province", province)) } public static func deserialize(dm: DataModel): Location { var dms = match (dm) { case data: DataModelStruct => data case _ => throw Exception("this data is not DataModelStruct") } var result = Location() result.country = String.deserialize(dms.get("country")) result.province = String.deserialize(dms.get("province")) return result } } main() { var js = ##"{ "name": "A", "age": 30, "loc": { "country": "China", "province": "Beijing" } }"## var jv = JsonValue.fromStr(js) var dm = DataModel.fromJson(jv) var A = Person.deserialize(dm) println("name == ${A.name}") println("age == ${A.age}") println("country == ${A.loc.getOrThrow().country}") println("province == ${A.loc.getOrThrow().province}") println("====================") // 上部分实现从 JSON 字符串到自定义类型的转换,下部分实现从自定义类型到 JSON 字符串的转换。 dm = A.serialize() var jo = dm.toJson().asObject() println(jo.toJsonString()) 0 }
1 DefoliationM 215 天前 via Android ts 就这样吧,感觉还好。go 的那个也挺麻烦的。 |
![]() | 2 irrigate2554 215 天前 和 dart 很像 |
![]() | 3 flyqie 214 天前 via Android 啥业务非得用这个语言啊... 难道是国产化要求用了? |
4 Tomatopotato 214 天前 我认为开发 cj 的那群人应该不会上这个论坛 (笑 |
![]() | 5 InkStone 214 天前 看了下都是 trivial 的字段映射。定制比较多的序列化和反序列化也就算了,这种 trivial 的就不能直接自动生成么 |
7 wuxilaoshiren 214 天前 @wsseo 学了可以干嘛 专门干国产化的嘛 |
8 wsseo OP @wuxilaoshiren 可以做后端开发,也可以鸿蒙 APP 开发 |
9 csfreshman 214 天前 还真有人学这个呀,这个赛道你们卷去吧,哈哈哈 |
10 sthwrong 214 天前 看起来就是要自己实现序列化反序列化接口,第三方做个序列化库,用注解生成序列化接口的实现也许可以。 |
![]() | 11 ns09005264 214 天前 这个写法就像是仓颉没有注解和反射功能。 |
12 Lockroach 149 天前 鸿蒙 app 现在主流是用 arkts 吧,感觉仓颉更像做嵌入式设备的 |