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

 

Artem Maltsev 我建议您添加我的版本,因为下载模块的用户将无法添加:.

if ((value = data["key1"]) == NULL) {
  Print("Value is NULL! Line: ", __LINE__);
  return;
}

if ((value = value[0]) == NULL) {
  Print("Value is NULL! Line: ", __LINE__);
  return;
}

if ((value = value["key2"]) == NULL) {
  Print("Value is NULL! Line: ", __LINE__);
  return;
}

if ((value = value[0]) == NULL) {
  Print("value is NULL! Line: ", __LINE__);
  return;
}

if ((value = value["key3"]) == NULL) {
  Print("Value is NULL! Line: ", __LINE__);
  return;
}
 

您能告诉我如何将四舍五入添加到双倍中吗?


下面有一个选项,但它添加了方括号。

      CJAVal js(NULL,jtUNDEF);
      double d = 0.05;
      js["OrderLot"].Add(d,2); //результат "OrderLot":[0.05].   

如何获取?

"OrderLot":0.05
 
Json 示例


{
  "id": 54,
  "nome": "12.01 alterado",
  "condicoes": [
    {
      "id": 47,
      "estrategiaId": 54,
      "indicadorAId": 87,
      "indicadorA": {
        "id": 87,
        "nome": "iATR",
        "parametros": [
          {
            "id": 46,
            "nome": null,
            "valor": 10.0
          }
        ]
      },
      "retornoA": 0,
      "comparador": ">",
      "indicadorBId": 88,
      "indicadorB": {
        "id": 88,
        "nome": "iAMA",
        "parametros": [
          {
            "id": 47,
            "nome": "Aplicar a",
            "valor": 1.0
          },
          {
            "id": 48,
            "nome": "Periodo rapido",
            "valor": 2.0
          },
          {
            "id": 49,
            "nome": "Periodo lento",
            "valor": 3.0
          },
          {
            "id": 50,
            "nome": "Deslocalmento",
            "valor": 4.0
          },
          {
            "id": 51,
            "nome": "Aplicar a",
            "valor": 0.0
          }
        ]
      },
      "retornoB": 0
    },
    {
      "id": 48,
      "estrategiaId": 54,
      "indicadorAId": 90,
      "indicadorA": {
        "id": 90,
        "nome": "iATR",
        "parametros": [
          {
            "id": 52,
            "nome": null,
            "valor": 10.0
          }
        ]
      },
      "retornoA": 0,
      "comparador": ">",
      "indicadorBId": 89,
      "indicadorB": {
        "id": 89,
        "nome": "iAMA",
        "parametros": [
          {
            "id": 53,
            "nome": "Aplicar a",
            "valor": 1.0
          },
          {
            "id": 54,
            "nome": "Periodo rapido",
            "valor": 2.0
          },
          {
            "id": 55,
            "nome": "Periodo lento",
            "valor": 3.0
          },
          {
            "id": 56,
            "nome": "Deslocalmento",
            "valor": 4.0
          },
          {
            "id": 57,
            "nome": "Aplicar a",
            "valor": 0.0
          }
        ]
      },
      "retornoB": 0
    }
  ]
}


我需要获取关键字 "condicoes "的数组
"condicoes":[ { "id": 47, ... } , { "id": 48, ... }]

我的代码 mql

   string pJS=" ... " // Json 样本
   js.Deserialize(pJS);
   Print(js["nome"].ToStr()); // 正确 = 12.01 alterado
   Print(js["condicoes"].m_type); // 类型 6 或 jtARRAY 是否正确
   Print(js["condicoes"].Size()); //不工作......返回 1,但正确的是 2

能帮我吗?

谢谢

 
Andre Luiz Medeiros Peixoto #:
Json 示例




我需要获取关键字 "condicoes "的数组
"condicoes":[ { "id": 47, ... } , { "id": 48, ... }] 。

我的代码 mql


能帮帮我吗?

谢谢

在我的电脑上运行正常。如何将 json 字符串放入 pJS 变量?

 

@Artem Maltsev 感谢你创建了这个 JSON 库。它是基于某个 C++ 库吗?

你有相关的性能基准吗?另外,它在内部使用 1 字节还是 2 字节字符来存储数据?

 

当值为空时 Deserialize() 会将类型设置为 jtNULL,但不会将 NULL赋值 给 m_sv,因此如果 ToStr() 方法与 NULL 比较,则返回 false:

#include <JAson.mqh>
//+------------------------------------------------------------------+
//| 脚本程序启动功能|
//+------------------------------------------------------------------+
void OnStart()
{
   string serialized="{\"a\":1,\"b\":null}";
   CJAVal json;
   json.Deserialize(serialized);
   if(json["b"].ToStr()==NULL)
   {
      Alert("b is NULL");
   }
   else if(json["b"].ToStr()=="")
   {
      Alert("b is an empty string");
   }
   else
   {
      Alert("b is ", json["b"].ToStr());
   }
}

输出结果如下

2022.03.28 17:50:02.833 test-jsonNULLComparison (GBPUSD,M30) 警报:b 为空字符串

解决方法是将值的类型与 jtNULL 进行比较,或者修改第 220 行的源代码,添加 "m_sv=NULL;":

if (i+3<slen) if (StringCompare(GetStr(js, i, 4), "null", false)==0) { m_sv=NULL; i+=3; return true; }
 

下午好!

酷库帮了我大忙,非常感谢。

我刚刚遇到了这个问题--如何从字符串中提取子串:

有一个字符串

{"类型": "设置", "数据":{"自动交易":true, "停止交易":true}}}。

我需要提取数据子串。

这样做行不通:

CJAVal js;

js.Deserialise(stroka);

js["data"].ToStr();

 
Ruslan Piraliyev #:

下午好!

很酷的图书馆帮了大忙,非常感谢。

我刚刚遇到了这个问题--如何从字符串中提取子串:

有一个字符串

{"类型": "设置", {"数据": "自动交易":true, "停止交易":true}}}。

我需要提取数据子串。

这样做行不通:

CJAVal js;

js.Deserialize(stroka);

js["data"].ToStr();

到目前为止,只找到了一种提取所需子串的方法:

js.Deserialize(stroka)

string data2=js["data"].Serialize();

js2.Deserialise(data2);

也就是说,所需子串应分别序列化和反序列化。

 
Sergey Likho #:

您能告诉我如何将四舍五入加到双倍吗?

下面有一个变体,但它增加了方括号。

如何得到?

像这样试试:

      CJAVal js(NULL,jtUNDEF);
      double d = 0.05;
      js["OrderLot"] = d;
 

不幸的是,有些东西又失灵了。

你怎么能从不灵的代码中吸取教训呢?

#include <JAson.mqh>
 CJAVal jv;
//+------------------------------------------------------------------+
//||
//+------------------------------------------------------------------+
void OnStart()
  {
 
   string user = "Test User";
   string account="testuser mail";
   string EA="010000";
   bool reply=false;

   jv["user"]=user;
   jv["account"]=account;
   jv["itemnumber"]=EA;

   char data[];
   ArrayResize(data, StringToCharArray(jv.Serialize(), data, 0, WHOLE_ARRAY)-1);

//--- 数据的传输
   char res_data[];
   string res_headers=NULL;
   int r=WebRequest("POST", "meine adresse", "Content-Type: text/plain\r\n", 5000, data, res_data, res_headers);
/ArrayPrint(data);

//--- 假设我们从响应中提取 {"reply": "true"}
//--- 访问令牌
   jv.Deserialize(res_data);
   string replyasstrinng=jv["isValid"].ToStr();
   Print("reply as string: ",replyasstrinng);
}

我现在用 GET 和 POST 进行了尝试。

"meine adresse"

当然,这是一个页面的 URL,其上的响应显示为

{"isValid":true}。

或者

{"isValid":false}或

作为响应。

但是,如果我使用

  Print("reply as string: ",replyasstrinng);

完全没有反应。

这是什么原因呢?