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

 

JSON Serialization and Deserialization (native MQL):

JSON 协议序列化和逆序列化。代码从高速的 С++ 程序库移植而来。

实践例程: 在网站上授权并解析响应

CJAVal jv;
jv["login"]="Login"; // 登录名
jv["password"]="Pass"; // 口令

//--- 字符串序列化  {"login":"Login","password":"Pass"}
char data[]; 
ArrayResize(data, StringToCharArray(jv.Serialize(), data, 0, WHOLE_ARRAY)-1);

//--- 发送数据
char res_data[];
string res_headers=NULL;
int r=WebRequest("POST", "http://my.site.com/Authorize", "Content-Type: text/plain\r\n", 5000, data, res_data, res_headers);

//--- 假设应答 {"accessToken":"ABRAKADABRA","session_id":124521}
//--- 获取访问令牌
jv.Deserialize(res_data);
string AccessToken=jv["accessToken"].ToStr();

作者: o_O

 

该库可在 MQL4 和 MQL5 中运行

如果您能提供使用 MQL 网络资源的实际工作案例,我们将不胜感激。)

 

在 MT4 中正常工作。在 MT5 中会显示堆栈 溢出错误。没有关于溢出位置的信息。调试器直接崩溃。

该错误出现在一个基本示例中:

#include <jason.mqh>

void OnStart()
{
   CJAVal json;
   json["item1"] = "value1";
   json["item2"] = "value2";
}

结果,脚本在第 90 行崩溃,"m_e "的大小从 1 增加到 2 倍:

ArrayResize(m_e,c+1);


附:MT5 版本 1210

 
a.p:

在 MT4 中正常工作。在 MT5 中会显示堆栈溢出错误。没有关于溢出位置的信息。调试器直接崩溃。

该错误出现在一个基本示例中:

结果,脚本在第 90 行崩溃,"m_e "的大小从 1 增加到 2 倍:


附:MT5 版本 1210

感谢您的留言,错误已得到修复。该修复将包含在终端的下一个版本中。
 

感谢您提供的库,但其中存在一些问题。

我不知道如何使用该库粘贴数组?

例如

string a[] = {"1", "2", "3"};
int b[] = {1, 2, 3};
double c[] = {1.1, 2.9, 3.03};

问题出现在声明 CJAVal 类型变量的 层面上。使用 CJAVal primer(jtARRAY, a); 并没有帮助。

您在示例中展示的数组示例对我不起作用--如果数组中有 10 个值怎么办? 我必须新建 10 个 CJAVal 类型的变量????。

请补充或扩展示例文件 ?????。

p.s. 我第一次使用 json 格式。我学习了您的示例文件程序。

 

哇,工作真辛苦!为了什么?就为了从一小行代码中提取几个变量。

为什么代码要这样格式化?这样就不会有人去研究它了吗?毕竟这是一个代码库。

 
Dmitry Fedoseev:

哇,工作真辛苦!为了什么?就为了从一小行代码中提取几个变量。

为什么代码要这样格式化?这样就不会有人去研究它了吗?毕竟这是一个代码库。

我对快速将任何数据写入文件 并快速提取的想法很感兴趣。可惜的是,Liba 并没有对人眼的可读性进行格式化:( 我倾向于这样一个事实,即我可能会为自己的任务编写这样一个程序。

代码已尽可能简化--最小化!

 
Виктор Василюк:

我对快速将任何数据写入文件 并快速提取的想法很感兴趣。遗憾的是,该程序库没有为人眼提供格式化的可读性:( 我倾向于这样一个事实,即我可能会为自己的任务编写这样一个程序。

代码已经尽可能简化--最小化!

它不适合这样的任务,它不像 PHP 或 C# 中的序列化。

这里有一勺酸味:

   virtual CJAVal *FindKey(string akey) { 
      for(int i=0; i<ArraySize(m_e); i++) 
      if(m_e[i].m_key==akey) 
      return GetPointer(m_e[i]); 
      return NULL; 
   }
密钥是通过简单的蛮力搜索得到的。你无法快速处理大量数据。
 
Dmitry Fedoseev:

它不适合这项任务,与 PHP 或 C# 中的序列化不同。

这里有一勺焦油:

密钥是通过简单的暴力搜索找到的。您将无法快速处理大量数据。
谢谢。找到了另一个库。似乎运行正常
 
Виктор Василюк:
谢谢。找到了另一个库。看起来运行正常
在那里,如果我没记错的话,哈希元素的数量是有限制的。
 
Dmitry Fedoseev:
如果我没记错的话,哈希元素的数量是有限的。
我们现在该怎么办? 还有其他解决方法吗?