导航:
论坛 -> DELPHI技术
斑竹:liumazi,sephil
作者:
2019/4/16 10:25:48
标题:
发现 D10.3.1 System.JSON.Serializers 反序列化的一个 Bug,大家帮测试下,确认后好提交到EMB
浏览:2516
加入我的收藏
楼主:
当Json包含Unicode特殊字符的时候,反序列化出现乱码。 unit Unit1; {$DEFINE UseSystemJSON} {$IF CompilerVersion<=31.0} {$UNDEF UseSystemJSON} {$ENDIF} interface uses Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics, Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls, System.Generics.Collections, REST.Json, System.JSON.Types, System.JSON.Serializers, XSuperObject; type TFoo = record id: Integer; Name: string; end; TFooArray = TArray<TFoo>; TForm1 = class(TForm) Button1: TButton; Memo1: TMemo; Button2: TButton; procedure Button1Click(Sender: TObject); procedure Button2Click(Sender: TObject); private { Private declarations } public { Public declarations } end; TJsonHelper = class Helper for REST.JSON.TJson public /// <summary> /// 对象、结构体、数组等序列化为 Json /// </summary> class function Object2Json<T>(AObject: T): string; static; /// <summary> /// Json 反序列化为对象、结构体、数组等 /// </summary> class function Json2Object<T>(const AJson: string): T; static; end; var Form1: TForm1; implementation {$R *.dfm} { TJsonHelper } class function TJsonHelper.Json2Object<T>(const AJson: string): T; begin {$IFDEF UseSystemJSON} with TJsonSerializer.Create do try DateTimeZoneHandling := TJsonDateTimeZoneHandling.Utc; // StringEscapeHandling := TJsonStringEscapeHandling.Default; StringEscapeHandling := TJsonStringEscapeHandling.EscapeNonAscii; Result := Deserialize<T>(AJson); finally Free; end; {$ELSE} Result := XSuperObject.TJson.Parse<T>(AJson); {$ENDIF} end; class function TJsonHelper.Object2Json<T>(AObject: T): string; begin {$IFDEF UseSystemJSON} with TJsonSerializer.Create do try DateTimeZoneHandling := TJsonDateTimeZoneHandling.Utc; // StringEscapeHandling := TJsonStringEscapeHandling.Default; StringEscapeHandling := TJsonStringEscapeHandling.EscapeNonAscii; Result := Serialize<T>(AObject); finally Free; end; {$ELSE} Result := XSuperObject.TJson.SuperObject<T>(AObject).AsJSON(); {$ENDIF} end; procedure TForm1.Button1Click(Sender: TObject); // const // JSON = '[{"id":1,"name":"\ue050\u677e\u5b50\ud83c\udfb8"},{"id":2,"name":"360\u00ba@VRM\ud83d\ude4f\ud83c\udffb"}]'; var Json: string; fooArray, fooArray1: TFooArray; begin SetLength(fooArray, 2); fooArray[0].id := 1; fooArray[0].Name := '松子🎸'; fooArray[1].id := 1; fooArray[1].Name := '360o@VRM🙏'; //Serialize Json := XSuperObject.TJson.SuperObject<TFooArray>(fooArray).AsJSON(); Memo1.Lines.Add(Json); // Deserialize fooArray1 := XSuperObject.TJson.Parse<TFooArray>(Json); for var foo in fooArray1 do Memo1.Lines.Add(foo.Name); // work fine. end; procedure TForm1.Button2Click(Sender: TObject); var Json: string; fooArray, fooArray1: TFooArray; begin SetLength(fooArray, 2); fooArray[0].id := 1; fooArray[0].Name := '松子🎸'; fooArray[1].id := 1; fooArray[1].Name := '360o@VRM🙏'; //Serialize Json := REST.JSON.TJson.Object2Json<TFooArray>(fooArray); Memo1.Lines.Add(Json); //Deserialize fooArray1 := REST.JSON.TJson.Json2Object<TFooArray>(Json); for var foo in fooArray1 do Memo1.Lines.Add(foo.Name); // unreadable code // 如果这样设置,即只转义控制字符,序列化和反序列化都没问题,但是我需要反序列化第三方提供的JsonString。 // TJsonSerializer.StringEscapeHandling := TJsonStringEscapeHandling.Default; end; end.
此帖子包含附件: 大小: 33.9K
----------------------------------------------
Delphi4Linux Delphi三层/FireDAC 技术群:734515869 http://www.cnblogs.com/rtcmw
作者:
2019/4/16 10:27:29
1楼:
源码
----------------------------------------------
Delphi4Linux Delphi三层/FireDAC 技术群:734515869 http://www.cnblogs.com/rtcmw
作者:
2019/4/16 11:06:10
2楼:
仅限 10.3.1 测试,其他 IDE 看看就行。
----------------------------------------------
(C)(P)Flying Wang
作者:
2019/4/16 11:24:46
3楼:
->
此帖子包含附件: 大小: 15.5K
----------------------------------------------
delphi 是兴趣,和工作无关,即使它倒闭。又不靠它 delphi 吃饭,怕甚?
作者:
2019/4/16 11:31:11
3楼:
基本可以确定是bug,准备提交QC。 据我了解,Delphi自带Json反序列化功能最全面的一个,支持对象,结构体,数组序列化和反序列化,支持字段别名,忽略字段等, 处理 JSON 很方便。 XSuperObject 不支持Json数组反序列化为Delphi数组。
----------------------------------------------
Delphi4Linux Delphi三层/FireDAC 技术群:734515869 http://www.cnblogs.com/rtcmw
作者:
2019/4/16 11:38:22
4楼:
更新源码,10.2 以上的版本可以编译
----------------------------------------------
Delphi4Linux Delphi三层/FireDAC 技术群:734515869 http://www.cnblogs.com/rtcmw
作者:
2019/4/16 11:59:51
5楼:
各位 4 楼 代码 在 安卓 IOS 下,是不是也出现问题?
----------------------------------------------
(C)(P)Flying Wang
作者:
2019/4/16 13:29:10
6楼:
修正一个 字母引发的 bug https://quality.embarcadero.com/browse/RSP-24262 求投票 没有账号的 到 http://edn.embarcadero.com/ 注册 @全体成员 注意:各种 bug fix 代码,都会发到 qc 上。不注册,不投票,后悔活该。
----------------------------------------------
(C)(P)Flying Wang
作者:
2019/4/16 13:38:54
7楼:
感谢老猫-wang_80919
----------------------------------------------
Delphi4Linux Delphi三层/FireDAC 技术群:734515869 http://www.cnblogs.com/rtcmw
作者:
2019/4/16 13:42:50
8楼:
感谢 爱吃猪头肉 找到 一个字母的错误。 另外,本人不喜欢吃 猪头肉,也不喜欢吃 红烧肉(太甜) 五花肉不错。
----------------------------------------------
(C)(P)Flying Wang
作者:
2019/4/16 13:53:20
9楼:
8楼猫哥啥时候改口味了?我这里有东北大酸菜炖五花肉,来吧!
----------------------------------------------
开心工作快乐生活
作者:
glwang (glwang)
★☆☆☆☆
-
盒子活跃会员
2019/4/16 14:20:06
7楼:
EDN Evolution - 我们正在投资更新Embarcadero开发者网络(EDN)门户网站。第1阶段(许可)已完成,第2阶段(下载)将于5月完成。我们正在为Update Subscription客户添加功能,包括管理密钥,帐户信息和访问下载的更简单方法。一个重要的变化是,不在更新订阅的用户将无法再访问EDN。我们计划为Premium Update Subscription维护合约客户提供独家EDN内容。
----------------------------------------------
作者:
2019/4/16 23:39:28
10楼:
都没人用了,还要使劲的藏着掖着。呵呵
----------------------------------------------
山外青山楼外楼,能人背后有能人弄..
作者:
2019/4/19 12:55:10
11楼:
生态真的不好 新版现在也就个人玩玩
----------------------------------------------
我为人人为我
作者:
2019/4/19 13:51:58
12楼:
没大公司、大厂商支持,也没人用,自己连优化编译器的人都没有,这要是有生态链,那才是见了鬼了。。。
----------------------------------------------
Delphi威武!千秋万代,一统江湖!Delphi威武!千秋万代,一统江湖!Delphi威武!千秋万代,一统江湖!Delphi威武!千秋万代,一统江湖!Delphi威武!千秋万代,一统江湖!Delphi威武!千秋万代,一统江湖!Delphi威武!千秋万代,一统江湖!我去WC吐一会儿去!
作者:
2019/4/22 2:43:54
13楼:
Delphi 自带的 JSON 那套东西,做序列化反序列化,一直有 BUG 的,不知道 10.3 修正了没。
----------------------------------------------
-
作者:
2019/4/22 9:01:13
14楼:
@pcplayer, System.JSON.Serializers 这是10.2新增加的功能。比之前REST.Json 里面序列化快多了,而且原来的只支持对象,不支持结构体和数组。 这功能用的是Delphi新JSON读写框架,主要包含 System.Json.Readers、 System.Json.Writers 、System.Json.Builders等,用法和Java的有点类似。 不知道你说的BUG是老版的,还是新版的。
----------------------------------------------
Delphi4Linux Delphi三层/FireDAC 技术群:734515869 http://www.cnblogs.com/rtcmw
作者:
2019/4/22 9:02:00
14楼:
一天到晚 老生常谈 优化编译器? 人家都改用 开源 编译器了,自己还需要优化什么? 你自己一个人用,就觉得,大家也是一个人用? 你自己在小公司,就觉得,大家也是在小公司? 不过,中国的大公司用 DELPHI 的确少,某些行业内的大公司,在某些人看来,还是很小。 国外的 大公司,还是有的。毕竟 不一定非得 世界 500强。 还有问问 EMB 为啥每一个版本 还要出一个 GSA 版本。给谁用的!
----------------------------------------------
(C)(P)Flying Wang
作者:
2019/7/21 12:00:03
15楼:
最新版的10.3.2已修复此问题,望周知。 发现问题及时反馈才是正确处理方式,再次感谢老猫。
----------------------------------------------
Delphi4Linux Delphi三层/FireDAC 技术群:734515869 http://www.cnblogs.com/rtcmw