增加Json类结果,未完全编译通过
This commit is contained in:
parent
fba440c0ec
commit
6df6b17225
|
@ -0,0 +1,374 @@
|
||||||
|
#include "Json.h"
|
||||||
|
|
||||||
|
|
||||||
|
JValue::JValue() : type_t(NIL) { }
|
||||||
|
|
||||||
|
JValue::JValue(Int64 i) : int_v(i), type_t(INT) { }
|
||||||
|
|
||||||
|
JValue::JValue(int i) : int_v(i), type_t(INT) { }
|
||||||
|
|
||||||
|
JValue::JValue(double f) : float_v(f), type_t(FLOAT) { }
|
||||||
|
|
||||||
|
JValue::JValue(bool b) : bool_v(b), type_t(BOOL) { }
|
||||||
|
|
||||||
|
JValue::JValue(cstring s) : string_v(s), type_t(STRING) { }
|
||||||
|
|
||||||
|
JValue::JValue(const String& s) : string_v(s.GetBuffer()), type_t(STRING) { }
|
||||||
|
|
||||||
|
JValue::JValue(const JObject& o) : object_v(o), type_t(OBJECT) { }
|
||||||
|
|
||||||
|
JValue::JValue(const JArray& o) : array_v(o), type_t(ARRAY) { }
|
||||||
|
|
||||||
|
JValue::JValue(String&& s) : string_v(s), type_t(STRING) { }
|
||||||
|
|
||||||
|
JValue::JValue(JObject&& o) : object_v(o), type_t(OBJECT) { }
|
||||||
|
|
||||||
|
JValue::JValue(JArray&& o) : array_v(o), type_t(ARRAY) { }
|
||||||
|
|
||||||
|
JValue::JValue(const JValue& v)
|
||||||
|
{
|
||||||
|
switch(v.type())
|
||||||
|
{
|
||||||
|
case INT:
|
||||||
|
int_v = v.int_v;
|
||||||
|
type_t = INT;
|
||||||
|
break;
|
||||||
|
|
||||||
|
case FLOAT:
|
||||||
|
float_v = v.float_v;
|
||||||
|
type_t = FLOAT;
|
||||||
|
break;
|
||||||
|
|
||||||
|
case BOOL:
|
||||||
|
bool_v = v.bool_v;
|
||||||
|
type_t = BOOL;
|
||||||
|
break;
|
||||||
|
|
||||||
|
case NIL:
|
||||||
|
type_t = NIL;
|
||||||
|
break;
|
||||||
|
|
||||||
|
case STRING:
|
||||||
|
string_v = v.string_v;
|
||||||
|
type_t = STRING;
|
||||||
|
break;
|
||||||
|
|
||||||
|
case ARRAY:
|
||||||
|
array_v = v.array_v;
|
||||||
|
type_t = ARRAY;
|
||||||
|
break;
|
||||||
|
|
||||||
|
case OBJECT:
|
||||||
|
object_v = v.object_v;
|
||||||
|
type_t = OBJECT;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
JValue::JValue(JValue&& v)
|
||||||
|
{
|
||||||
|
switch(v.type())
|
||||||
|
{
|
||||||
|
case INT:
|
||||||
|
int_v = (v.int_v);
|
||||||
|
type_t = INT;
|
||||||
|
break;
|
||||||
|
|
||||||
|
case FLOAT:
|
||||||
|
float_v = (v.float_v);
|
||||||
|
type_t = FLOAT;
|
||||||
|
break;
|
||||||
|
|
||||||
|
case BOOL:
|
||||||
|
bool_v = (v.bool_v);
|
||||||
|
type_t = BOOL;
|
||||||
|
break;
|
||||||
|
|
||||||
|
case NIL:
|
||||||
|
type_t = NIL;
|
||||||
|
break;
|
||||||
|
|
||||||
|
case STRING:
|
||||||
|
string_v= (v.string_v);
|
||||||
|
type_t = STRING;
|
||||||
|
break;
|
||||||
|
|
||||||
|
case ARRAY:
|
||||||
|
array_v = (v.array_v);
|
||||||
|
type_t = ARRAY;
|
||||||
|
break;
|
||||||
|
|
||||||
|
case OBJECT:
|
||||||
|
object_v= (v.object_v);
|
||||||
|
type_t = OBJECT;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
JValue& JValue::operator=(const JValue& v)
|
||||||
|
{
|
||||||
|
switch(v.type())
|
||||||
|
{
|
||||||
|
case INT:
|
||||||
|
int_v = v.int_v;
|
||||||
|
type_t = INT;
|
||||||
|
break;
|
||||||
|
|
||||||
|
case FLOAT:
|
||||||
|
float_v = v.float_v;
|
||||||
|
type_t = FLOAT;
|
||||||
|
break;
|
||||||
|
|
||||||
|
case BOOL:
|
||||||
|
bool_v = v.bool_v;
|
||||||
|
type_t = BOOL;
|
||||||
|
break;
|
||||||
|
|
||||||
|
case NIL:
|
||||||
|
type_t = NIL;
|
||||||
|
break;
|
||||||
|
|
||||||
|
case STRING:
|
||||||
|
string_v = v.string_v;
|
||||||
|
type_t = STRING;
|
||||||
|
break;
|
||||||
|
|
||||||
|
case ARRAY:
|
||||||
|
array_v = v.array_v;
|
||||||
|
type_t = ARRAY;
|
||||||
|
break;
|
||||||
|
|
||||||
|
case OBJECT:
|
||||||
|
object_v = v.object_v;
|
||||||
|
type_t = OBJECT;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
return *this;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
JValue& JValue::operator=(JValue&& v)
|
||||||
|
{
|
||||||
|
switch(v.type())
|
||||||
|
{
|
||||||
|
case INT:
|
||||||
|
int_v = (v.int_v);
|
||||||
|
type_t = INT;
|
||||||
|
break;
|
||||||
|
|
||||||
|
case FLOAT:
|
||||||
|
float_v = (v.float_v);
|
||||||
|
type_t = FLOAT;
|
||||||
|
break;
|
||||||
|
|
||||||
|
case BOOL:
|
||||||
|
bool_v = (v.bool_v);
|
||||||
|
type_t = BOOL;
|
||||||
|
break;
|
||||||
|
|
||||||
|
case NIL:
|
||||||
|
type_t = NIL;
|
||||||
|
break;
|
||||||
|
|
||||||
|
case STRING:
|
||||||
|
string_v = (v.string_v);
|
||||||
|
type_t = STRING;
|
||||||
|
break;
|
||||||
|
|
||||||
|
case ARRAY:
|
||||||
|
array_v = (v.array_v);
|
||||||
|
type_t = ARRAY;
|
||||||
|
break;
|
||||||
|
|
||||||
|
case OBJECT:
|
||||||
|
object_v = (v.object_v);
|
||||||
|
type_t = OBJECT;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
return *this;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
JValue& JValue::operator[] (cstring key)
|
||||||
|
{
|
||||||
|
if (type() != OBJECT)
|
||||||
|
throw ("JValue not an object");
|
||||||
|
return object_v[key];
|
||||||
|
}
|
||||||
|
|
||||||
|
const JValue& JValue::operator[] (cstring key) const
|
||||||
|
{
|
||||||
|
if (type() != OBJECT)
|
||||||
|
throw ("JValue not an object");
|
||||||
|
return object_v[key];
|
||||||
|
}
|
||||||
|
|
||||||
|
JValue& JValue::operator[] (uint i)
|
||||||
|
{
|
||||||
|
if (type() != ARRAY)
|
||||||
|
throw ("JValue not an array");
|
||||||
|
return array_v[i];
|
||||||
|
}
|
||||||
|
|
||||||
|
const JValue& JValue::operator[] (uint i) const
|
||||||
|
{
|
||||||
|
if (type() != ARRAY)
|
||||||
|
throw ("JValue not an array");
|
||||||
|
return array_v[i];
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
JObject::JObject() { }
|
||||||
|
|
||||||
|
JObject::~JObject() { }
|
||||||
|
|
||||||
|
JObject::JObject(const JObject& o) : _items(o._items) { }
|
||||||
|
|
||||||
|
JObject::JObject(JObject&& o) : _items((o._items)) { }
|
||||||
|
|
||||||
|
JObject& JObject::operator=(const JObject& o)
|
||||||
|
{
|
||||||
|
_items = o._items;
|
||||||
|
return *this;
|
||||||
|
}
|
||||||
|
|
||||||
|
JObject& JObject::operator=(JObject&& o)
|
||||||
|
{
|
||||||
|
_items = (o._items);
|
||||||
|
return *this;
|
||||||
|
}
|
||||||
|
|
||||||
|
JValue& JObject::operator[] (cstring key)
|
||||||
|
{
|
||||||
|
return *_items[key];
|
||||||
|
}
|
||||||
|
|
||||||
|
const JValue& JObject::operator[] (cstring key) const
|
||||||
|
{
|
||||||
|
return *_items[key];
|
||||||
|
}
|
||||||
|
|
||||||
|
void JObject::Add(cstring key, JValue& value)
|
||||||
|
{
|
||||||
|
_items.Add(key, &value);
|
||||||
|
}
|
||||||
|
|
||||||
|
uint JObject::size() const
|
||||||
|
{
|
||||||
|
return _items.Count();
|
||||||
|
}
|
||||||
|
|
||||||
|
String& JObject::ToStr(String& str) const
|
||||||
|
{
|
||||||
|
auto& keys = _items.Keys();
|
||||||
|
auto& vals = _items.Values();
|
||||||
|
str += '{';
|
||||||
|
for(int i=0; i<size(); i++)
|
||||||
|
{
|
||||||
|
if(i > 0) str += ',';
|
||||||
|
|
||||||
|
auto key = (cstring)keys[i];
|
||||||
|
str = str + '"' + key + '"' + ':';
|
||||||
|
|
||||||
|
auto& val = *(JValue*)vals[i];
|
||||||
|
val.ToStr(str);
|
||||||
|
}
|
||||||
|
str += '}';
|
||||||
|
|
||||||
|
return str;
|
||||||
|
}
|
||||||
|
|
||||||
|
JArray::JArray() { }
|
||||||
|
|
||||||
|
JArray::~JArray() { }
|
||||||
|
|
||||||
|
JArray::JArray(const JArray& a) : _array(a._array) { }
|
||||||
|
|
||||||
|
JArray::JArray(JArray&& a) : _array((a._array)) { }
|
||||||
|
|
||||||
|
JArray& JArray::operator=(const JArray& a)
|
||||||
|
{
|
||||||
|
_array = a._array;
|
||||||
|
return *this;
|
||||||
|
}
|
||||||
|
|
||||||
|
JArray& JArray::operator=(JArray&& a)
|
||||||
|
{
|
||||||
|
_array = (a._array);
|
||||||
|
return *this;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
JValue& JArray::operator[] (uint i)
|
||||||
|
{
|
||||||
|
return *_array[i];
|
||||||
|
}
|
||||||
|
|
||||||
|
const JValue& JArray::operator[] (uint i) const
|
||||||
|
{
|
||||||
|
return *_array[i];
|
||||||
|
}
|
||||||
|
|
||||||
|
uint JArray::size() const
|
||||||
|
{
|
||||||
|
return _array.Count();
|
||||||
|
}
|
||||||
|
|
||||||
|
void JArray::Add(const JValue& v)
|
||||||
|
{
|
||||||
|
_array.Add(&(JValue&)v);
|
||||||
|
}
|
||||||
|
|
||||||
|
String& JArray::ToStr(String& str) const
|
||||||
|
{
|
||||||
|
str += '[';
|
||||||
|
for(int i=0; i<size(); i++)
|
||||||
|
{
|
||||||
|
if(i > 0) str += ',';
|
||||||
|
|
||||||
|
auto& v = (*this)[i];
|
||||||
|
v.ToStr(str);
|
||||||
|
}
|
||||||
|
str += ']';
|
||||||
|
|
||||||
|
return str;
|
||||||
|
}
|
||||||
|
|
||||||
|
String& JValue::ToStr(String& str) const
|
||||||
|
{
|
||||||
|
auto& v = *this;
|
||||||
|
switch(v.type())
|
||||||
|
{
|
||||||
|
case INT:
|
||||||
|
str += (int)v;
|
||||||
|
break;
|
||||||
|
|
||||||
|
case FLOAT:
|
||||||
|
str += (double)v;
|
||||||
|
break;
|
||||||
|
|
||||||
|
case BOOL:
|
||||||
|
str += ((bool)v ? "true" : "false");
|
||||||
|
break;
|
||||||
|
|
||||||
|
case NIL:
|
||||||
|
str += "null";
|
||||||
|
break;
|
||||||
|
|
||||||
|
case STRING:
|
||||||
|
str = str + '"' + (String)v + '"';
|
||||||
|
break;
|
||||||
|
|
||||||
|
case ARRAY:
|
||||||
|
((JArray)v).ToStr(str);
|
||||||
|
break;
|
||||||
|
|
||||||
|
case OBJECT:
|
||||||
|
((JObject)v).ToStr(str);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
return str;
|
||||||
|
}
|
|
@ -0,0 +1,150 @@
|
||||||
|
#ifndef __Json_H__
|
||||||
|
#define __Json_H__
|
||||||
|
|
||||||
|
#include "Type.h"
|
||||||
|
#include "SString.h"
|
||||||
|
#include "List.h"
|
||||||
|
#include "Dictionary.h"
|
||||||
|
|
||||||
|
/** Json值类型 */
|
||||||
|
enum ValueType
|
||||||
|
{
|
||||||
|
INT, // JSON's int
|
||||||
|
FLOAT, // JSON's float 3.14 12e-10
|
||||||
|
BOOL, // JSON's boolean (true, false)
|
||||||
|
STRING, // JSON's string " ... " or (not really JSON) ' ... '
|
||||||
|
OBJECT, // JSON's object { ... }
|
||||||
|
ARRAY, // JSON's array [ ... ]
|
||||||
|
NIL // JSON's null
|
||||||
|
};
|
||||||
|
|
||||||
|
class JValue;
|
||||||
|
|
||||||
|
// Json对象
|
||||||
|
class JObject
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
|
||||||
|
JObject();
|
||||||
|
JObject(const JObject& o);
|
||||||
|
JObject(JObject&& o);
|
||||||
|
|
||||||
|
JObject& operator=(const JObject& o);
|
||||||
|
JObject& operator=(JObject&& o);
|
||||||
|
|
||||||
|
~JObject();
|
||||||
|
|
||||||
|
JValue& operator[] (cstring key);
|
||||||
|
const JValue& operator[] (cstring key) const;
|
||||||
|
|
||||||
|
// 插入
|
||||||
|
void Add(cstring key, JValue& value);
|
||||||
|
|
||||||
|
// 大小
|
||||||
|
uint size() const;
|
||||||
|
|
||||||
|
String& ToStr(String& str) const;
|
||||||
|
|
||||||
|
protected:
|
||||||
|
|
||||||
|
// 内部容器
|
||||||
|
Dictionary<cstring, JValue*> _items;
|
||||||
|
};
|
||||||
|
|
||||||
|
// Json数组
|
||||||
|
class JArray
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
|
||||||
|
JArray();
|
||||||
|
|
||||||
|
~JArray();
|
||||||
|
|
||||||
|
JArray(const JArray& a);
|
||||||
|
JArray(JArray&& a);
|
||||||
|
|
||||||
|
JArray& operator=(const JArray& a);
|
||||||
|
JArray& operator=(JArray&& a);
|
||||||
|
|
||||||
|
JValue& operator[] (uint i);
|
||||||
|
const JValue& operator[] (uint i) const;
|
||||||
|
|
||||||
|
// 添加
|
||||||
|
void Add(const JValue& n);
|
||||||
|
|
||||||
|
// 大小
|
||||||
|
uint size() const;
|
||||||
|
|
||||||
|
String& ToStr(String& str) const;
|
||||||
|
|
||||||
|
protected:
|
||||||
|
|
||||||
|
// 内部容器
|
||||||
|
List<JValue*> _array;
|
||||||
|
};
|
||||||
|
|
||||||
|
// Json值
|
||||||
|
class JValue
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
|
||||||
|
JValue();
|
||||||
|
JValue(const JValue& v);
|
||||||
|
JValue(Int64 i);
|
||||||
|
JValue(int i);
|
||||||
|
JValue(double f);
|
||||||
|
JValue(bool b);
|
||||||
|
JValue(cstring s);
|
||||||
|
JValue(const String& s);
|
||||||
|
JValue(const JObject& o);
|
||||||
|
JValue(const JArray& a);
|
||||||
|
|
||||||
|
JValue(JValue&& v);
|
||||||
|
JValue(String&& s);
|
||||||
|
JValue(JObject&& o);
|
||||||
|
JValue(JArray&& a);
|
||||||
|
|
||||||
|
ValueType type() const
|
||||||
|
{
|
||||||
|
return type_t;
|
||||||
|
}
|
||||||
|
|
||||||
|
JValue& operator[] (cstring key);
|
||||||
|
const JValue& operator[] (cstring key) const;
|
||||||
|
|
||||||
|
JValue& operator[] (uint i);
|
||||||
|
const JValue& operator[] (uint i) const;
|
||||||
|
|
||||||
|
JValue& operator=(const JValue& v);
|
||||||
|
JValue& operator=(JValue&& v);
|
||||||
|
|
||||||
|
explicit operator double() const { return float_v; }
|
||||||
|
explicit operator int() const { return int_v; }
|
||||||
|
explicit operator bool() const { return bool_v; }
|
||||||
|
explicit operator String() const { return string_v; }
|
||||||
|
|
||||||
|
operator JObject () const { return object_v; }
|
||||||
|
operator JArray () const { return array_v; }
|
||||||
|
|
||||||
|
double as_float() const { return float_v; }
|
||||||
|
int as_int() const { return int_v; }
|
||||||
|
bool as_bool() const { return bool_v; }
|
||||||
|
String as_string() const { return string_v; }
|
||||||
|
|
||||||
|
String& ToStr(String& str) const;
|
||||||
|
|
||||||
|
|
||||||
|
protected:
|
||||||
|
|
||||||
|
double float_v;
|
||||||
|
Int64 int_v;
|
||||||
|
bool bool_v;
|
||||||
|
String string_v;
|
||||||
|
|
||||||
|
JObject object_v;
|
||||||
|
JArray array_v;
|
||||||
|
|
||||||
|
ValueType type_t;
|
||||||
|
};
|
||||||
|
|
||||||
|
#endif
|
Loading…
Reference in New Issue