change json seralization of map<string,T> to be object rather than array of pairs

This commit is contained in:
Daniel Larimer 2016-03-17 17:24:25 -04:00
parent 0dca15c395
commit a421e28048
5 changed files with 48 additions and 1 deletions

View file

@ -93,10 +93,17 @@ namespace fc
template<typename K, typename T>
void from_variant( const variant& var, fc::flat_map<K,T>& vo );
template<typename T>
void to_variant( const std::map<string,T>& var, variant& vo );
template<typename T>
void from_variant( const variant& var, std::map<string,T>& vo );
template<typename K, typename T>
void to_variant( const std::map<K,T>& var, variant& vo );
template<typename K, typename T>
void from_variant( const variant& var, std::map<K,T>& vo );
template<typename K, typename T>
void to_variant( const std::multimap<K,T>& var, variant& vo );
template<typename K, typename T>
@ -401,6 +408,8 @@ namespace fc
vo.insert( itr->as< std::pair<K,T> >() );
}
template<typename K, typename T>
void to_variant( const std::map<K, T>& var, variant& vo )
{

View file

@ -5,6 +5,7 @@
namespace fc
{
using std::map;
class mutable_variant_object;
/**
@ -66,6 +67,15 @@ namespace fc
/** initializes the first key/value pair in the object */
variant_object( string key, variant val );
template<typename T>
variant_object( const map<string,T>& values )
:_key_value( new std::vector<entry>() ) {
_key_value->reserve( values.size() );
for( const auto& item : values ) {
_key_value->emplace_back( entry( item.first, fc::variant(item.second) ) );
}
}
template<typename T>
variant_object( string key, T&& val )
@ -196,6 +206,15 @@ namespace fc
mutable_variant_object();
template<typename T>
mutable_variant_object( const map<string,T>& values )
:_key_value( new std::vector<entry>() ) {
_key_value->reserve( values.size() );
for( const auto& item : values ) {
_key_value->emplace_back( variant_object::entry( item.first, fc::variant(item.second) ) );
}
}
/** initializes the first key/value pair in the object */
mutable_variant_object( string key, variant val );
template<typename T>
@ -212,6 +231,8 @@ namespace fc
mutable_variant_object& operator=( mutable_variant_object&& );
mutable_variant_object& operator=( const mutable_variant_object& );
mutable_variant_object& operator=( const variant_object& );
private:
std::unique_ptr< std::vector< entry > > _key_value;
friend class variant_object;
@ -221,4 +242,19 @@ namespace fc
/** @ingroup Serializable */
void from_variant( const variant& var, mutable_variant_object& vo );
template<typename T>
void to_variant( const std::map<string, T>& var, variant& vo )
{
vo = variant_object( var );
}
template<typename T>
void from_variant( const variant& var, std::map<string, T>& vo )
{
const auto& obj = var.get_object();
vo.clear();
for( auto itr = obj.begin(); itr != obj.end(); ++itr )
vo[itr->key()] = itr->value().as<T>();
}
} // namespace fc

View file

@ -74,6 +74,7 @@ std::string websocket_api_connection::on_message(
const std::string& message,
bool send_message /* = true */ )
{
wdump((message));
try
{
auto var = fc::json::from_string(message);

View file

@ -163,6 +163,7 @@ namespace fc
return *this;
}
void to_variant( const variant_object& var, variant& vo )
{
vo = variant(var);

2
vendor/websocketpp vendored

@ -1 +1 @@
Subproject commit 378437aecdcb1dfe62096ffd5d944bf1f640ccc3
Subproject commit c5510d6de04917812b910a8dd44735c1f17061d9