Opened 7 years ago
Last modified 7 years ago
#11662 new Bugs
Parse Json
| Reported by: | Owned by: | Sebastian Redl | |
|---|---|---|---|
| Milestone: | To Be Determined | Component: | property_tree |
| Version: | Boost 1.58.0 | Severity: | Problem |
| Keywords: | Json, ptree | Cc: |
Description
use Boost to Parse Json on linux! when I use it with multithreading ,the Program crash!!
my code: json_test.h
#ifndef UNIT_JSON_BUGTEST_H
#define UNIT_JSON_BUGTEST_H
#include <boost/property_tree/ptree.hpp>
#include <boost/property_tree/json_parser.hpp>
#include <boost/foreach.hpp>
#include <boost/thread/thread.hpp>
#include <sstream>
#include <map>
using namespace boost;
using namespace boost::property_tree;
using namespace std;
#define JSON_BUG "{\"onlineUser\":[{\"username\":\"131898@QQ.COM\",\"framedipaddress\":\"10.10.1.3\"},{\"username\":\"a258055085@163.com\",\"framedipaddress\":\"10.10.1.4\"},{\"username\":\"77476848@QQ.COM\",\"framedipaddress\":\"10.10.1.5\"},{\"username\":\"tyws0001@163.com\",\"framedipaddress\":\"10.10.1.10\"},{\"username\":\"zbr7066895@163.com\",\"framedipaddress\":\"10.10.1.9\"},{\"username\":\"1733064835@qq.com\",\"framedipaddress\":\"10.10.1.12\"}]}"
typedef multimap<string, string> onlineuser_map;
onlineuser_map get_online_user_map(const string strJson);
void unit_json_bugtest_main();
#endif
json_test.cpp
#include "unit_json_bugtest.h"
onlineuser_map get_online_user_map(const string strJson)
{
onlineuser_map mymap;
// cout << strJson << endl;
stringstream ssJson(strJson);
ptree pt;
try{
read_json(ssJson, pt);
}
catch(...)
{
cout << "read json string error" <<endl;
return mymap;
}
try{
ptree ptInfoArray = pt.get_child("onlineUser");
BOOST_FOREACH(ptree::value_type &v, ptInfoArray)
{
ptree ptChild;
std::stringstream streamChild;
write_json(streamChild, v.second);
json_parser::read_json(streamChild, ptChild);
mymap.insert(make_pair(ptChild.get<string>("username"), ptChild.get<string>("framedipaddress")));
}
}
catch(...)
{
mymap.clear();
cout << "read json string error" <<endl;
return mymap;
}
return mymap;
}
int i;
void my_thread_fun(int itest)
{
get_online_user_map(JSON_BUG);
cout << "i'm OK!!: " << itest<<endl;
}
void main()
{
i = 0;
while(1)
{
thread th(my_thread_fun,i);
i++;
usleep(10);
}
}
Note:
See TracTickets
for help on using tickets.
