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:
parent
b78781707e
commit
3f7e69b617
14 changed files with 729 additions and 761 deletions
|
@ -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
|
||||
|
||||
////////////////////////////////////////////////////////////////////////////////////////////////
|
||||
|
|
|
@ -112,6 +112,12 @@ public:
|
|||
* user must ensure the type is a ecma array, or assert failed.
|
||||
*/
|
||||
virtual SrsJsonArray* to_array();
|
||||
// json
|
||||
public:
|
||||
/**
|
||||
* convert the amf0 stuff to json.
|
||||
*/
|
||||
virtual std::string to_json();
|
||||
public:
|
||||
static SrsJsonAny* str(const char* value = NULL);
|
||||
static SrsJsonAny* boolean(bool value = false);
|
||||
|
@ -145,6 +151,12 @@ public:
|
|||
virtual std::string key_at(int index);
|
||||
// @remark: max index is count().
|
||||
virtual SrsJsonAny* value_at(int index);
|
||||
// json
|
||||
public:
|
||||
/**
|
||||
* convert the amf0 object to json.
|
||||
*/
|
||||
virtual std::string to_json();
|
||||
public:
|
||||
virtual void set(std::string key, SrsJsonAny* value);
|
||||
virtual SrsJsonAny* get_property(std::string name);
|
||||
|
@ -171,6 +183,14 @@ public:
|
|||
// @remark: max index is count().
|
||||
virtual SrsJsonAny* at(int index);
|
||||
virtual void add(SrsJsonAny* value);
|
||||
// alias to add.
|
||||
virtual void append(SrsJsonAny* value);
|
||||
// json
|
||||
public:
|
||||
/**
|
||||
* convert the amf0 ecma array to json.
|
||||
*/
|
||||
virtual std::string to_json();
|
||||
};
|
||||
|
||||
////////////////////////////////////////////////////////////////////////
|
||||
|
|
|
@ -35,55 +35,6 @@ using namespace std;
|
|||
|
||||
using namespace _srs_internal;
|
||||
|
||||
/* 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 "]"
|
||||
|
||||
// AMF0 marker
|
||||
#define RTMP_AMF0_Number 0x00
|
||||
#define RTMP_AMF0_Boolean 0x01
|
||||
|
@ -331,60 +282,6 @@ char* SrsAmf0Any::human_print(char** pdata, int* psize)
|
|||
return data;
|
||||
}
|
||||
|
||||
string SrsAmf0Any::to_json()
|
||||
{
|
||||
switch (marker) {
|
||||
case RTMP_AMF0_String: {
|
||||
return "\"" + to_str() + "\"";
|
||||
}
|
||||
case RTMP_AMF0_Boolean: {
|
||||
return to_boolean()? "true":"false";
|
||||
}
|
||||
case RTMP_AMF0_Number: {
|
||||
double v = to_number();
|
||||
int64_t iv = (int64_t)v;
|
||||
|
||||
// len(max int64_t) is 20, plus one "+-."
|
||||
char tmp[22];
|
||||
if (v == iv) {
|
||||
snprintf(tmp, 22, "%"PRId64, iv);
|
||||
} else {
|
||||
snprintf(tmp, 22, "%.6f", to_number());
|
||||
}
|
||||
|
||||
return tmp;
|
||||
}
|
||||
case RTMP_AMF0_Null: {
|
||||
return "null";
|
||||
}
|
||||
case RTMP_AMF0_Undefined: {
|
||||
return "null";
|
||||
}
|
||||
case RTMP_AMF0_Object: {
|
||||
SrsAmf0Object* obj = to_object();
|
||||
return obj->to_json();
|
||||
}
|
||||
case RTMP_AMF0_EcmaArray: {
|
||||
SrsAmf0EcmaArray* arr = to_ecma_array();
|
||||
return arr->to_json();
|
||||
}
|
||||
case RTMP_AMF0_StrictArray: {
|
||||
SrsAmf0StrictArray* arr = to_strict_array();
|
||||
return arr->to_json();
|
||||
}
|
||||
case RTMP_AMF0_Date: {
|
||||
// TODO: FIXME: support amf0 data to json.
|
||||
return "null";
|
||||
}
|
||||
case RTMP_AMF0_Invalid:
|
||||
default: {
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
return "null";
|
||||
}
|
||||
|
||||
SrsAmf0Any* SrsAmf0Any::str(const char* value)
|
||||
{
|
||||
return new SrsAmf0String(value);
|
||||
|
@ -846,27 +743,6 @@ SrsAmf0Any* SrsAmf0Object::copy()
|
|||
return copy;
|
||||
}
|
||||
|
||||
string SrsAmf0Object::to_json()
|
||||
{
|
||||
stringstream ss;
|
||||
|
||||
ss << SRS_JOBJECT_START;
|
||||
|
||||
for (int i = 0; i < properties->count(); i++) {
|
||||
std::string name = this->key_at(i);
|
||||
SrsAmf0Any* any = this->value_at(i);
|
||||
|
||||
ss << SRS_JFIELD_NAME(name) << any->to_json();
|
||||
if (i < properties->count() - 1) {
|
||||
ss << SRS_JFIELD_CONT;
|
||||
}
|
||||
}
|
||||
|
||||
ss << SRS_JOBJECT_END;
|
||||
|
||||
return ss.str();
|
||||
}
|
||||
|
||||
void SrsAmf0Object::clear()
|
||||
{
|
||||
properties->clear();
|
||||
|
@ -1068,27 +944,6 @@ SrsAmf0Any* SrsAmf0EcmaArray::copy()
|
|||
return copy;
|
||||
}
|
||||
|
||||
string SrsAmf0EcmaArray::to_json()
|
||||
{
|
||||
stringstream ss;
|
||||
|
||||
ss << SRS_JOBJECT_START;
|
||||
|
||||
for (int i = 0; i < properties->count(); i++) {
|
||||
std::string name = this->key_at(i);
|
||||
SrsAmf0Any* any = this->value_at(i);
|
||||
|
||||
ss << SRS_JFIELD_NAME(name) << any->to_json();
|
||||
if (i < properties->count() - 1) {
|
||||
ss << SRS_JFIELD_CONT;
|
||||
}
|
||||
}
|
||||
|
||||
ss << SRS_JOBJECT_END;
|
||||
|
||||
return ss.str();
|
||||
}
|
||||
|
||||
void SrsAmf0EcmaArray::clear()
|
||||
{
|
||||
properties->clear();
|
||||
|
@ -1264,27 +1119,6 @@ SrsAmf0Any* SrsAmf0StrictArray::copy()
|
|||
return copy;
|
||||
}
|
||||
|
||||
string SrsAmf0StrictArray::to_json()
|
||||
{
|
||||
stringstream ss;
|
||||
|
||||
ss << SRS_JARRAY_START;
|
||||
|
||||
for (int i = 0; i < (int)properties.size(); i++) {
|
||||
SrsAmf0Any* any = properties[i];
|
||||
|
||||
ss << any->to_json();
|
||||
|
||||
if (i < (int)properties.size() - 1) {
|
||||
ss << SRS_JFIELD_CONT;
|
||||
}
|
||||
}
|
||||
|
||||
ss << SRS_JARRAY_END;
|
||||
|
||||
return ss.str();
|
||||
}
|
||||
|
||||
void SrsAmf0StrictArray::clear()
|
||||
{
|
||||
properties.clear();
|
||||
|
|
|
@ -272,12 +272,6 @@ public:
|
|||
* @remark user must free the data returned or output by pdata.
|
||||
*/
|
||||
virtual char* human_print(char** pdata, int* psize);
|
||||
// json
|
||||
public:
|
||||
/**
|
||||
* convert the amf0 stuff to json.
|
||||
*/
|
||||
virtual std::string to_json();
|
||||
// create AMF0 instance.
|
||||
public:
|
||||
/**
|
||||
|
@ -357,12 +351,6 @@ public:
|
|||
virtual int read(SrsStream* stream);
|
||||
virtual int write(SrsStream* stream);
|
||||
virtual SrsAmf0Any* copy();
|
||||
// json
|
||||
public:
|
||||
/**
|
||||
* convert the amf0 object to json.
|
||||
*/
|
||||
virtual std::string to_json();
|
||||
// properties iteration
|
||||
public:
|
||||
/**
|
||||
|
@ -446,12 +434,6 @@ public:
|
|||
virtual int read(SrsStream* stream);
|
||||
virtual int write(SrsStream* stream);
|
||||
virtual SrsAmf0Any* copy();
|
||||
// json
|
||||
public:
|
||||
/**
|
||||
* convert the amf0 ecma array to json.
|
||||
*/
|
||||
virtual std::string to_json();
|
||||
// properties iteration
|
||||
public:
|
||||
/**
|
||||
|
@ -533,12 +515,6 @@ public:
|
|||
virtual int read(SrsStream* stream);
|
||||
virtual int write(SrsStream* stream);
|
||||
virtual SrsAmf0Any* copy();
|
||||
// json
|
||||
public:
|
||||
/**
|
||||
* convert the amf0 strict array to json.
|
||||
*/
|
||||
virtual std::string to_json();
|
||||
// properties iteration
|
||||
public:
|
||||
/**
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue