1
0
Fork 0
mirror of https://github.com/ossrs/srs.git synced 2025-03-09 15:49:59 +00:00

json objects support dumps to string.

This commit is contained in:
winlin 2015-09-19 12:27:31 +08:00
parent b78781707e
commit 3f7e69b617
14 changed files with 729 additions and 761 deletions

View file

@ -23,10 +23,60 @@ CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
#include <srs_protocol_json.hpp>
#include <sstream>
using namespace std;
#include <srs_kernel_log.hpp>
/* json encode
cout<< SRS_JOBJECT_START
<< SRS_JFIELD_STR("name", "srs") << SRS_JFIELD_CONT
<< SRS_JFIELD_ORG("version", 100) << SRS_JFIELD_CONT
<< SRS_JFIELD_NAME("features") << SRS_JOBJECT_START
<< SRS_JFIELD_STR("rtmp", "released") << SRS_JFIELD_CONT
<< SRS_JFIELD_STR("hls", "released") << SRS_JFIELD_CONT
<< SRS_JFIELD_STR("dash", "plan")
<< SRS_JOBJECT_END << SRS_JFIELD_CONT
<< SRS_JFIELD_STR("author", "srs team")
<< SRS_JOBJECT_END
it's:
cont<< "{"
<< "name:" << "srs" << ","
<< "version:" << 100 << ","
<< "features:" << "{"
<< "rtmp:" << "released" << ","
<< "hls:" << "released" << ","
<< "dash:" << "plan"
<< "}" << ","
<< "author:" << "srs team"
<< "}"
that is:
"""
{
"name": "srs",
"version": 100,
"features": {
"rtmp": "released",
"hls": "released",
"dash": "plan"
},
"author": "srs team"
}
"""
*/
#define SRS_JOBJECT_START "{"
#define SRS_JFIELD_NAME(k) "\"" << k << "\":"
#define SRS_JFIELD_OBJ(k) SRS_JFIELD_NAME(k) << SRS_JOBJECT_START
#define SRS_JFIELD_STR(k, v) SRS_JFIELD_NAME(k) << "\"" << v << "\""
#define SRS_JFIELD_ORG(k, v) SRS_JFIELD_NAME(k) << std::dec << v
#define SRS_JFIELD_BOOL(k, v) SRS_JFIELD_ORG(k, (v? "true":"false"))
#define SRS_JFIELD_NULL(k) SRS_JFIELD_NAME(k) << "null"
#define SRS_JFIELD_ERROR(ret) "\"" << "code" << "\":" << ret
#define SRS_JFIELD_CONT ","
#define SRS_JOBJECT_END "}"
#define SRS_JARRAY_START "["
#define SRS_JARRAY_END "]"
#ifdef SRS_JSON_USE_NXJSON
////////////////////////////////////////////////////////////////////////////////////////////////
@ -267,6 +317,46 @@ SrsJsonArray* SrsJsonAny::to_array()
return p;
}
string SrsJsonAny::to_json()
{
switch (marker) {
case SRS_JSON_String: {
return "\"" + to_str() + "\"";
}
case SRS_JSON_Boolean: {
return to_boolean()? "true":"false";
}
case SRS_JSON_Integer: {
// len(max int64_t) is 20, plus one "+-."
char tmp[22];
snprintf(tmp, 22, "%"PRId64, to_integer());
return tmp;
}
case SRS_JSON_Number: {
// len(max int64_t) is 20, plus one "+-."
char tmp[22];
snprintf(tmp, 22, "%.6f", to_number());
return tmp;
}
case SRS_JSON_Null: {
return "null";
}
case SRS_JSON_Object: {
SrsJsonObject* obj = to_object();
return obj->to_json();
}
case SRS_JSON_Array: {
SrsJsonArray* arr = to_array();
return arr->to_json();
}
default: {
break;
}
}
return "null";
}
SrsJsonAny* SrsJsonAny::str(const char* value)
{
return new SrsJsonString(value);
@ -402,6 +492,27 @@ SrsJsonAny* SrsJsonObject::value_at(int index)
return elem.second;
}
string SrsJsonObject::to_json()
{
stringstream ss;
ss << SRS_JOBJECT_START;
for (int i = 0; i < (int)properties.size(); i++) {
std::string name = this->key_at(i);
SrsJsonAny* any = this->value_at(i);
ss << SRS_JFIELD_NAME(name) << any->to_json();
if (i < (int)properties.size() - 1) {
ss << SRS_JFIELD_CONT;
}
}
ss << SRS_JOBJECT_END;
return ss.str();
}
void SrsJsonObject::set(string key, SrsJsonAny* value)
{
if (!value) {
@ -549,6 +660,32 @@ void SrsJsonArray::add(SrsJsonAny* value)
properties.push_back(value);
}
void SrsJsonArray::append(SrsJsonAny* value)
{
add(value);
}
string SrsJsonArray::to_json()
{
stringstream ss;
ss << SRS_JARRAY_START;
for (int i = 0; i < (int)properties.size(); i++) {
SrsJsonAny* any = properties[i];
ss << any->to_json();
if (i < (int)properties.size() - 1) {
ss << SRS_JFIELD_CONT;
}
}
ss << SRS_JARRAY_END;
return ss.str();
}
#ifdef SRS_JSON_USE_NXJSON
////////////////////////////////////////////////////////////////////////////////////////////////