为什么通过BOOST创造了这个JSON字符串长度超过我的服务器所需的有什么不同?(Why this

2019-11-03 18:51发布

我使用升压创建JSON字符串。 我试图通过HTTP POST这个JSON字符串发送给服务器。

以下是BOOST创建字符串

{"TokenNo":"XYZ123456","CPUID":"XYZ123456","CommandID":"05","IsEncrypted":"0","CommandString":"{\"ADD\":\"97\",\"ESTBCODE\":\"99999999\",\"EID\":\"XY\",\"CID\":\"0154400000\",\"DATE\":\"14042015\",\"TIME\":\"1835\",\"IOMODE\":\"I\",\"REASONCODE\":\"55\",\"LAT\":\"87\",\"LONG\":\"90\"}"}

在HTTP POST成功,但回复是不是我期待:

HTTP 200
Cache-Control: no-cache
Pragma: no-cache
Content-Type: application/json; charset=utf-8
Expires: -1
Server: Microsoft-IIS/7.5
X-AspNet-Version: 4.0.30319
X-Powered-By: ASP.NET
Date: Mon, 20 Apr 2015 13:06:58 GMT
Connection: close

{"CmdStatDesc":"Exception on processing command data"}

一个成功的发布的答复将是这个样子:

HTTP 200
//rest of the header

{"CmdStatDesc":"SUCCESS"}

当我在我的服务器端(测试期间)检查该HTTP POST预期的JSON字符串是如下:

{"TokenNo":"XYZ123456","CPUID":"XYZ123456","CommandID":"05","IsEncrypted":"0","CommandString":"[{\"ADD\":\"97\",\"ESTBCODE\":\"99999999\",\"EID\":\"XY\", \"CID\":\"0154400000\",\"DATE\":\"14042015\", \"TIME\":\"1835\",\"IOMODE\":\"I\",\"REASONCODE\":\"55\",\"LAT\":\"87\",\"LONG\":\"90\"}]"}

预期的(上文)字符串包含方括号[]而由BOOST形成的JSON字符串没有。

这究竟是为什么?

为什么通过BOOST创建的JSON字符串是不是在服务器端产生预期的JSON字符串不同?

注意 - 我已经测试视觉工作室(无BOOST)和后的类似的方案是成功的,形成在VS JSON字符串是按照服务器的要求(具有方括号)。 但我这样做是在Linux上,当使用提振字符串是不同的。

以下是我的main.cpp

namespace ALPHA1
{
struct POST3
{
    public:
    std::string TokenNo;
    std::string CPUID;
    std::string CommandID;
    std::string IsEncrypted;
    std::string JSON_Cmnd_String;
};

std::string to_json(POST3 const& o)
{
    ptree out;
        out.add("TokenNo", o.TokenNo);
        out.add("CPUID", o.CPUID);
        out.add("CommandID", o.CommandID);
        out.add("IsEncrypted", o.IsEncrypted);
        out.add("CommandString", o.JSON_Cmnd_String);

        std::ostringstream oss;
        boost::property_tree::write_json(oss, out, false);

    std:: string json;
    json = oss.str();       

 return oss.str();
}

};
int main()
{
        ALPHA1::POST3 obj { "XYZ123456", "XYZ123456", "05", "0", object1.dump(object1)};
    std::cout <<to_json(obj) << std::endl;
}

而下面是形成JSON字符串另一个文件中的代码:

void sqliteDB::writeJson(std::ostream& os) const {
    using namespace boost::property_tree;
    ptree pt;

for (auto &entry : AttendanceT_list) 
{       
        pt.add("ADD", entry.Atten_Addr);
        pt.add("ESTBCODE", entry.Atten_EstablishmentCode);
        pt.add("EID", entry.Atten_EmployeeID);
        pt.add("CID", entry.Atten_CardID);
        pt.add("DATE", entry.Atten_PunchDate);
        pt.add("TIME", entry.Atten_PunchTime);
        pt.add("IOMODE", entry.Atten_InOutMode);
        pt.add("REASONCODE", entry.Atten_ReasonCode);
        pt.add("LAT", entry.Atten_Lat);
        pt.add("LONG", entry.Atten_Long);                   
}
    write_json(os, pt, false);
}

Answer 1:

迭代列表中创建一个ptree中数组,如下所示(如果我理解正确的话):

ptree pt_list;
for (auto &entry : AttendanceT_list) {       
    ptree pt;
    pt.add("ADD", entry.Atten_Addr);
    // ...
    pt_list.push_back(std::make_pair("", pt));
}
ptree pt;
pt.push_back(std::make_pair("CommandString", pt_list));
// ...
write_json(os, pt, false);

另见: 如何使用boost :: property_tree创建一个数组?



文章来源: Why this JSON string created by BOOST is different than the one required by my server?