程序库: JSON Serialization and Deserialization (native MQL) - 页 17

[删除]  

该库导致 ERROR,我确认了这一点

ERR_WRONG_STRING_PARAMETER
 
5040
 
Damaged parameter of string type
 

我的代码

CJAVal  jv;
string text="abc";

jv.Deserialize(text);

有办法解决吗?

只有当我删除任何字符串时才会出现这种情况

 

如果字符串值包含"; "字符,则反序列化失败!

array out of range in 'JAson.mqh' (205,13)

 
Dmitry Zhakov

一切正常。我发现了自己的问题。

 
谢谢。我正在从 MT5 (MQL5) 发送 POST WebRequests (http) 到 Chat GPT-4-o-mini API (openai.com) . OpenAI 接收 JSON 数据 . MQL 不支持 JSON .因此必须转换为字符串,然后将字符串转换为 Char[] 数组,作为 postData 插入到 WebRequest 中。 我正在使用您的库,我会让您知道我的进展情况。
 
Philip Kym Sang Nelson #:
谢谢。我正在从 MT5 (MQL5) 向 Chat GPT-4-o-mini API (openai.com) 发送 POST WebRequests (http) 。OpenAI 接收 JSON 数据。MQL 不支持 JSON。因此必须转换为字符串,然后将字符串转换为 Char[] 数组,作为 postData 插入到 WebRequest 中。我正在使用您的库,我会让您知道我的进展情况。



介意分享一下您是如何做到的吗? 谢谢!

 
完美运行 Kudos :)请查看我的文章:如何使用 CJVAL 类解析 json 数据在 MetaTrader 5 中从 JSON 响应中提取特定数据
Trading blogs and financial markets analysis
Trading blogs and financial markets analysis
  • www.mql5.com
Read blogs to find the latest news on various topics from all over the world — rumors about companies, country and industry reports, market analysis, latest developments in speculative trading and more. Start your own blog to share new ideas and trading achievements with the members of MQL5.community. Post interesting images and videos, enjoy unlimited possibilities!
 

你好,有没有办法

- 将键的值设置为空

- 将键的值设置为 {}(空对象)

如果尝试设置这些值,似乎无法正确表示这些值。

感谢您的回复

 

我做错了什么?
一个实践中的真实例子。一个字符串长达 2.1 万多个字符。有几个变量和 2 个大数组 b 和 a。每个数组有 500 个子数组,每个子数组有 2 个元素:

"b":[["0.0018659","8500"],["0.0018655","16800"],...],
"a":[["0.0018659","8500"],["0.0018655","16800"],...],


我发现原始数据和 JASON 输出的数据有出入:

["0.0019640","800"],["0.0019641","91500"],["0.0019644","96600"],["0.0019645","503900"],["0.0019646","101600"],
["0.0019649","500"],["0.0019650","300"],["0.0019651","1200"],["0.0019652","500"],["0.0019653","800"]],
n=2000
[ 0]      0.0018659,  8500.0000000,     0.0018655, 16800.0000000,     0.0018654,153000.0000000,     0.0018653,  3800.0000000,     0.0018650,   300.0000000
[10]      0.0018649,   900.0000000,     0.0018647,  2900.0000000,     0.0018645,  6700.0000000,     0.0018644, 33700.0000000,     0.0018640,  9600.0000000
[ 0]     0.0019640,  200.0000000,    0.0019641,25600.0000000,    0.0019644, 3000.0000000,    0.0019645, 3800.0000000,    0.0019646,  200.0000000
[10]     0.0019649, 3600.0000000,    0.0019650,  700.0000000,    0.0019651,  200.0000000,    0.0019652,  700.0000000,    0.0019653,  100.0000000


解析时,所有元素都被写入数组。得到 n=2000 个元素。
然后两行是数组 前 20 个元素,再后两行是后 20 个元素。
在数组的开头,所有元素都是匹配的。
但在结尾,数字对的第一个数字是匹配的,但第二个数字却 匹配。 显然,这是从其他地方取来的。

我检查了一下。第二个数组 a 包含第一个数组 b 中的数据。这是数组 a 中原始数据的结尾:

,["0.0017785","200"],["0.0017784","3600"],["0.0017783","700"],["0.0017782","200"],["0.0017781","700"],["0.0017780","100"]],


问题可能出在解析器代码中。

数据替换非常麻烦--以后如何测试呢?只有错误!幸好你注意到了。希望没有嵌套数组的简单变体能正常工作。

代码基于分支中的示例,只是使用了我的数据字符串

 void TestJAson(string msg) {
   CJAVal json; 
   json.Deserialize(msg);
   double bin[];int n=0;
   int s=ArraySize(json["data"]["b"].m_e);
   ArrayResize(bin, n+s*2, 100000);
   for(int  i=0; i<s; i++){
      bin[n]=json["data"]["b"][i][0].ToDbl(); n++;//价格
      bin[n]=json["data"]["b"][i][1].ToDbl();; n++;//卷
   }

   s=ArraySize(json["data"]["a"].m_e);
   ArrayResize(bin, n+s*2, 100000);
   for(int  i=0; i<s; i++){
      bin[n]=json["data"]["a"][i][0].ToDbl(); n++;//价格
      bin[n]=json["data"]["b"][i][1].ToDbl(); n++;//卷
   }
   
   Print(StringSubstr(msg,StringLen(msg)-300,300));
   
   int tot=ArraySize(bin);
   Print("n=",tot);
   ArrayPrint(bin,7,",",0,20);
   ArrayPrint(bin,7,",",tot-20,20);
}

void OnStart(){
   ulong from=GetMicrosecondCount();
   TestJAson(message);
   ulong to=GetMicrosecondCount();
   PrintFormat("MQL %lu mcs/iteration",(to-from));
}


库的最新版本 "1.13" - 从 GitHub 下载。

附加的文件:
3.mq5  53 kb
 

上面还写到了第二个元素的问题。可能是同样的问题。

我自己做了一个特定模板的数据解析,通过用引号"...... "分割,然后按编号选择元素。

减号--每个模板都要花费时间编写自己的解析器并计算元素的数量......
加号--3 倍于 JASON 的通用性和便利性。而不是 40 秒 13 的初始数据 ~400 Mb。

花了半天时间。
更准确地说,是 3 个版本:
1) 首先,我在字符数组中搜索特定的子串,然后将其值组合成字符串--我认为这将是最快的代码
我想直接使用字符数组,因为我有来自WebRequest 或 FileOpen 的原始字符数组,不想为了速度而将其组合成一个大字符串。
2) 然后,从 char[] 中创建字符串。
3) 最后是最简单的代码--将每个字符串集合成一个大的文本字符串(包含所有数据,包括不必要的数据),然后将其拆分

结果表明,这三种变体的速度差不多。因此,我决定采用最简单的第 3 种变体。以后将其修改为包含其他数据的其他模板会更容易。

出于某种原因,我认为使用字符数组会比将其组装成字符串并通过""分割成字符串数组更快。显然,拆分在速度上已经优化得很好了。

如果MQ 开发人员 能在语言中添加一些标准的 JSON 解析器就更好了。JASON 不能正确解析所有变体,而且显然开发人员已经不在了,修复的希望渺茫。
 
Forester #:
最新版本 "1.13 "库 - 从 GitHub 下载

此 topik (1.12) 的代码有一个重写的分叉。您检查过原版吗?

PS: 我有 1.12 的原始版本,并进行了大量修正。我不记得是从哪里修改的了,可能是这个分支吧。