DELPHI盒子
!实时搜索: 盒子论坛 | 注册用户 | 修改信息 | 退出
检举帖 | 全文检索 | 关闭广告 | 捐赠
技术论坛
 用户名
 密  码
自动登陆(30天有效)
忘了密码
≡技术区≡
DELPHI技术
lazarus/fpc/Free Pascal
移动应用开发
Web应用开发
数据库专区
报表专区
网络通讯
开源项目
论坛精华贴
≡发布区≡
发布代码
发布控件
文档资料
经典工具
≡事务区≡
网站意见
盒子之家
招聘应聘
信息交换
论坛信息
最新加入: laidabin
今日帖子: 1
在线用户: 10
导航: 论坛 -> DELPHI技术 斑竹:liumazi,sephil  
作者:
男 earthsbest (全能中间件) ▲▲▲▲△ -
普通会员
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.
此帖子包含附件:
PNG 图像
大小:33.9K
----------------------------------------------
Delphi4Linux Delphi三层/FireDAC 技术群:734515869 http://www.cnblogs.com/rtcmw
作者:
男 earthsbest (全能中间件) ▲▲▲▲△ -
普通会员
2019/4/16 10:27:29
1楼: 源码
此帖子包含附件:earthsbest_2019416102941.zip 大小:85.4K
----------------------------------------------
Delphi4Linux Delphi三层/FireDAC 技术群:734515869 http://www.cnblogs.com/rtcmw
作者:
男 wang_80919 (Flying Wang) ★☆☆☆☆ -
普通会员
2019/4/16 11:06:10
2楼: 仅限 10.3.1 测试,其他 IDE 看看就行。
----------------------------------------------
(C)(P)Flying Wang
作者:
男 sail2000 (小帆工作室) ★☆☆☆☆ -
盒子活跃会员
2019/4/16 11:24:46
3楼: ->
此帖子包含附件:
PNG 图像
大小:15.5K
----------------------------------------------
delphi 是兴趣,和工作无关,即使它倒闭。又不靠它 delphi 吃饭,怕甚?
作者:
男 earthsbest (全能中间件) ▲▲▲▲△ -
普通会员
2019/4/16 11:31:11
3楼: 基本可以确定是bug,准备提交QC。

据我了解,Delphi自带Json反序列化功能最全面的一个,支持对象,结构体,数组序列化和反序列化,支持字段别名,忽略字段等, 处理 JSON 很方便。

XSuperObject 不支持Json数组反序列化为Delphi数组。
----------------------------------------------
Delphi4Linux Delphi三层/FireDAC 技术群:734515869 http://www.cnblogs.com/rtcmw
作者:
男 earthsbest (全能中间件) ▲▲▲▲△ -
普通会员
2019/4/16 11:38:22
4楼: 更新源码,10.2 以上的版本可以编译
此帖子包含附件:earthsbest_2019416113822.zip 大小:85.7K
----------------------------------------------
Delphi4Linux Delphi三层/FireDAC 技术群:734515869 http://www.cnblogs.com/rtcmw
作者:
男 wang_80919 (Flying Wang) ★☆☆☆☆ -
普通会员
2019/4/16 11:59:51
5楼: 各位 4 楼 代码 在 安卓 IOS 下,是不是也出现问题?
----------------------------------------------
(C)(P)Flying Wang
作者:
男 wang_80919 (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
作者:
男 earthsbest (全能中间件) ▲▲▲▲△ -
普通会员
2019/4/16 13:38:54
7楼: 感谢老猫-wang_80919
----------------------------------------------
Delphi4Linux Delphi三层/FireDAC 技术群:734515869 http://www.cnblogs.com/rtcmw
作者:
男 wang_80919 (Flying Wang) ★☆☆☆☆ -
普通会员
2019/4/16 13:42:50
8楼: 感谢 爱吃猪头肉 找到 一个字母的错误。
另外,本人不喜欢吃 猪头肉,也不喜欢吃 红烧肉(太甜)
五花肉不错。
----------------------------------------------
(C)(P)Flying Wang
作者:
男 runsky2012 (路在脚下) ▲▲△△△ -
普通会员
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内容。
----------------------------------------------
作者:
男 zyp1984 (小李他妈的飞刀) ★☆☆☆☆ -
普通会员
2019/4/16 23:39:28
10楼: 都没人用了,还要使劲的藏着掖着。呵呵
----------------------------------------------
山外青山楼外楼,能人背后有能人弄..
作者:
男 lsz100 (lsz) ★☆☆☆☆ -
盒子活跃会员
2019/4/19 12:55:10
11楼: 生态真的不好 新版现在也就个人玩玩
----------------------------------------------
我为人人为我
作者:
男 feiyanm (feiyanm) ▲▲▲▲▲ -
普通会员
2019/4/19 13:51:58
12楼: 没大公司、大厂商支持,也没人用,自己连优化编译器的人都没有,这要是有生态链,那才是见了鬼了。。。
----------------------------------------------
Delphi威武!千秋万代,一统江湖!Delphi威武!千秋万代,一统江湖!Delphi威武!千秋万代,一统江湖!Delphi威武!千秋万代,一统江湖!Delphi威武!千秋万代,一统江湖!Delphi威武!千秋万代,一统江湖!Delphi威武!千秋万代,一统江湖!我去WC吐一会儿去!
作者:
男 pcplayer (pcplayer) ★☆☆☆☆ -
普通会员
2019/4/22 2:43:54
13楼: Delphi 自带的 JSON 那套东西,做序列化反序列化,一直有 BUG 的,不知道 10.3 修正了没。
----------------------------------------------
-
作者:
男 earthsbest (全能中间件) ▲▲▲▲△ -
普通会员
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
作者:
男 wang_80919 (Flying Wang) ★☆☆☆☆ -
普通会员
2019/4/22 9:02:00
14楼: 一天到晚 老生常谈 优化编译器?
人家都改用 开源 编译器了,自己还需要优化什么?
你自己一个人用,就觉得,大家也是一个人用?
你自己在小公司,就觉得,大家也是在小公司?
不过,中国的大公司用 DELPHI 的确少,某些行业内的大公司,在某些人看来,还是很小。
国外的 大公司,还是有的。毕竟 不一定非得 世界 500强。
还有问问 EMB 为啥每一个版本 还要出一个 GSA 版本。给谁用的!
----------------------------------------------
(C)(P)Flying Wang
作者:
男 earthsbest (全能中间件) ▲▲▲▲△ -
普通会员
2019/7/21 12:00:03
15楼: 最新版的10.3.2已修复此问题,望周知。
发现问题及时反馈才是正确处理方式,再次感谢老猫。
----------------------------------------------
Delphi4Linux Delphi三层/FireDAC 技术群:734515869 http://www.cnblogs.com/rtcmw
信息
登陆以后才能回复
Copyright © 2CCC.Com 盒子论坛 v3.0.1 版权所有 页面执行181.6406毫秒 RSS