【问题标题】:How to create a TSuperObject instance by parsing a json array?如何通过解析 json 数组来创建 TSuperObject 实例?
【发布时间】:2014-09-02 12:22:00
【问题描述】:

这是一个有效的json

[{"id":1, "name":"foo"}, {"id":2, "name":"bar"}]

如何从这个string 创建一个TSuperObject

【问题讨论】:

    标签: delphi delphi-6 superobject


    【解决方案1】:

    如果您在浏览器中打开readme.html,您将在该文档的最开头看到:

    解析 JSON 数据结构

    var
      obj: ISuperObject;
    begin
      obj := SO('{"foo": true}');
      obj := TSuperObject.ParseString('{"foo": true}');
      obj := TSuperObject.ParseStream(stream);
      obj := TSuperObject.ParseFile(FileName);
    end;
    

    【讨论】:

    • 第一行(begin 之后)引发整数溢出,因此第二行
    • 这些示例要么已弃用,要么错误。
    • Readme.html 是您应该阅读的文件的完美名称,但如果将名称更改为 Secret-PleaseDoNotRead.html,可能会有更多人阅读。如果你反对这个向作者投诉。您还应该关注issue list,因为这就是公开的重点(处理该EIntOverflow 异常仍有一个未解决的问题)。顺便说一句,代码在 XE6 上完美运行
    • 请准确定义“此代码不起作用”。它以什么方式失败?
    • @DavidHeffernan 我已经说过了。它会引发 EIntOverflow。
    【解决方案2】:

    Delphi 6 存在一个错误。

    SO() 函数尝试转换字符串的值时,它会引发EIntOverflow

    这个bug是由于这个函数造成的:

    class function TSuperAvlEntry.Hash(const k: SOString): Cardinal; 
    

    This is the bug in the google's issue tracker

    错误报告者提出的解决方法是将函数更改为:

    class function TSuperAvlEntry.Hash(const k: SOString): Cardinal;
    var
      h: cardinal;
      i: Integer;
    begin
      h := 0;
    {$Q-}
      for i := 1 to Length(k) do
        h := Cardinal( h*129 + ord(k[i]) + $9e370001);
      Result := h;
    end;
    {$Q+}
    

    【讨论】:

      猜你喜欢
      • 2017-11-07
      • 2016-08-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-01-05
      • 2016-01-13
      相关资源
      最近更新 更多