Bwar / CJsonObject

Ultralightweight JSON parser in C++ based on cJSON
MIT License
648 stars 239 forks source link

当json对象内数据为空时,通过ToString返回值是不是欠妥? #31

Closed xiaonuo911teamo closed 4 years ago

xiaonuo911teamo commented 4 years ago

当json对象内数据为空时,通过ToString返回值为空字符串。但是标准的空json,应该是{}。Parse也是不能解析空字符串的。

xiaonuo911teamo commented 4 years ago

我的临时解决方案只是多加了一个判断。

std::string CJsonObject::ToString() const
{
    char* pJsonString = NULL;
    std::string strJsonData = "";
    if (m_pJsonData != NULL)
    {
        pJsonString = cJSON_PrintUnformatted(m_pJsonData);
    }
    else if (m_pExternJsonDataRef != NULL)
    {
        pJsonString = cJSON_PrintUnformatted(m_pExternJsonDataRef);
    }
    if (pJsonString != NULL)
    {
        strJsonData = pJsonString;
        free(pJsonString);
    }
   // add
    else
    {
    strJsonData = "{}";
    }
    return(strJsonData);
}
Bwar commented 4 years ago

json数据为空时返回的是{}或[],你试着用{}和[]构建CJsonObject对象再ToString()就知道了。ToString()就是返回真实的json字符串,你这样改反而是错的。

xiaonuo911teamo commented 4 years ago

我是这样考虑的。因为使用CJsonObject的默认构造函数,构造出来的一个对象。我认为他是一个空的json对象,应该与{}对应。所以才这样考虑的。 不过看了您的回复,貌似我不修改代码,在构造对象时,通过CJsonObject obj("{}"); 就是我认为的 json 空对象了吧。

Bwar commented 4 years ago

CJsonObject obj("{}")可以达到你的目的。 默认构造函数是不构造json的,因为不清楚使用者是想构建{}还是构建[],空的json数组也属于json对象的一种。因此,默认构造函数是不构造json,待调用Add()函数时就能创建使用者所需的json。