Initial support for export to JSON
This commit is contained in:
@@ -100,6 +100,7 @@ namespace chaiscript
|
|||||||
:(Common_Types::t_uint64);
|
:(Common_Types::t_uint64);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
static Common_Types get_common_type(const Boxed_Value &t_bv)
|
static Common_Types get_common_type(const Boxed_Value &t_bv)
|
||||||
{
|
{
|
||||||
const Type_Info &inp_ = t_bv.get_type_info();
|
const Type_Info &inp_ = t_bv.get_type_info();
|
||||||
@@ -513,6 +514,21 @@ namespace chaiscript
|
|||||||
validate_boxed_number(bv);
|
validate_boxed_number(bv);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static bool is_floating_point(const Boxed_Value &t_bv)
|
||||||
|
{
|
||||||
|
const Type_Info &inp_ = t_bv.get_type_info();
|
||||||
|
|
||||||
|
if (inp_ == typeid(double)) {
|
||||||
|
return true;
|
||||||
|
} else if (inp_ == typeid(long double)) {
|
||||||
|
return true;
|
||||||
|
} else if (inp_ == typeid(float)) {
|
||||||
|
return true;
|
||||||
|
} else {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
Boxed_Number get_as(const Type_Info &inp_) const
|
Boxed_Number get_as(const Type_Info &inp_) const
|
||||||
{
|
{
|
||||||
if (inp_.bare_equal_type_info(typeid(int))) {
|
if (inp_.bare_equal_type_info(typeid(int))) {
|
||||||
|
@@ -199,10 +199,10 @@ class JSON
|
|||||||
JSON( T b, typename enable_if<is_same<T,bool>::value>::type* = 0 ) : Internal( b ), Type( Class::Boolean ){}
|
JSON( T b, typename enable_if<is_same<T,bool>::value>::type* = 0 ) : Internal( b ), Type( Class::Boolean ){}
|
||||||
|
|
||||||
template <typename T>
|
template <typename T>
|
||||||
JSON( T i, typename enable_if<is_integral<T>::value && !is_same<T,bool>::value>::type* = 0 ) : Internal( (long)i ), Type( Class::Integral ){}
|
JSON( T i, typename enable_if<is_integral<T>::value && !is_same<T,bool>::value>::type* = 0 ) : Internal( long(i) ), Type( Class::Integral ){}
|
||||||
|
|
||||||
template <typename T>
|
template <typename T>
|
||||||
JSON( T f, typename enable_if<is_floating_point<T>::value>::type* = 0 ) : Internal( (double)f ), Type( Class::Floating ){}
|
JSON( T f, typename enable_if<is_floating_point<T>::value>::type* = 0 ) : Internal( double(f) ), Type( Class::Floating ){}
|
||||||
|
|
||||||
template <typename T>
|
template <typename T>
|
||||||
JSON( T s, typename enable_if<is_convertible<T,string>::value>::type* = 0 ) : Internal( string( s ) ), Type( Class::String ){}
|
JSON( T s, typename enable_if<is_convertible<T,string>::value>::type* = 0 ) : Internal( string( s ) ), Type( Class::String ){}
|
||||||
|
@@ -66,6 +66,84 @@ namespace chaiscript
|
|||||||
return from_json( json::JSON::Load(t_json) );
|
return from_json( json::JSON::Load(t_json) );
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static json::JSON to_json_object(const Boxed_Value &t_bv)
|
||||||
|
{
|
||||||
|
try {
|
||||||
|
const std::map<std::string, Boxed_Value> m = chaiscript::boxed_cast<const std::map<std::string, Boxed_Value> &>(t_bv);
|
||||||
|
|
||||||
|
json::JSON obj;
|
||||||
|
for (const auto &o : m)
|
||||||
|
{
|
||||||
|
obj[o.first] = to_json_object(o.second);
|
||||||
|
}
|
||||||
|
return obj;
|
||||||
|
} catch (const chaiscript::exception::bad_boxed_cast &) {
|
||||||
|
// not a map
|
||||||
|
}
|
||||||
|
|
||||||
|
try {
|
||||||
|
const std::vector<Boxed_Value> v = chaiscript::boxed_cast<const std::vector<Boxed_Value> &>(t_bv);
|
||||||
|
|
||||||
|
json::JSON obj;
|
||||||
|
for (size_t i = 0; i < v.size(); ++i)
|
||||||
|
{
|
||||||
|
obj[i] = to_json_object(v[i]);
|
||||||
|
}
|
||||||
|
return obj;
|
||||||
|
} catch (const chaiscript::exception::bad_boxed_cast &) {
|
||||||
|
// not a vector
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
try {
|
||||||
|
Boxed_Number bn(t_bv);
|
||||||
|
json::JSON obj;
|
||||||
|
if (Boxed_Number::is_floating_point(t_bv))
|
||||||
|
{
|
||||||
|
obj = bn.get_as<double>();
|
||||||
|
} else {
|
||||||
|
obj = bn.get_as<long>();
|
||||||
|
}
|
||||||
|
} catch (const chaiscript::detail::exception::bad_any_cast &) {
|
||||||
|
// not a number
|
||||||
|
}
|
||||||
|
|
||||||
|
try {
|
||||||
|
bool b = boxed_cast<bool>(t_bv);
|
||||||
|
json::JSON obj;
|
||||||
|
obj = b;
|
||||||
|
return obj;
|
||||||
|
} catch (const chaiscript::exception::bad_boxed_cast &) {
|
||||||
|
// not a bool
|
||||||
|
}
|
||||||
|
|
||||||
|
try {
|
||||||
|
std::string s = boxed_cast<std::string>(t_bv);
|
||||||
|
json::JSON obj;
|
||||||
|
obj = s;
|
||||||
|
return obj;
|
||||||
|
} catch (const chaiscript::exception::bad_boxed_cast &) {
|
||||||
|
// not a string
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
try {
|
||||||
|
const chaiscript::dispatch::Dynamic_Object &o = boxed_cast<const dispatch::Dynamic_Object &>(t_bv);
|
||||||
|
|
||||||
|
json::JSON obj;
|
||||||
|
for (const auto &attr : o.get_attrs())
|
||||||
|
{
|
||||||
|
obj[attr.first] = to_json_object(attr.second);
|
||||||
|
}
|
||||||
|
return obj;
|
||||||
|
} catch (const chaiscript::exception::bad_boxed_cast &) {
|
||||||
|
// not a dynamic object
|
||||||
|
}
|
||||||
|
|
||||||
|
throw std::runtime_error("Unknown object type to convert to JSON");
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user