Facebook の友達リストを JSON 形式で取得し、解析して、特定のデータ構造にロードするプロジェクトに取り組んでいます。
この場合、arrayList に入れています。私は、教授がオンラインで見つけて使用を推奨したVJSONというライブラリを使用しています。私はコンピュータ エンジニアリングの 2 年生にすぎないので、これらのライブラリにあるほとんどの資料は、クラスの他の全員と同様に、私の頭上にあるものです。それでも彼はとにかくそれを使うことを勧めました。
VJSON クラスは JSON テキスト ファイルを解析し、javascript オブジェクトに格納します。これらのオブジェクトにアクセスするには、「ルート」から始めて、リンク リスト形式の次の各オブジェクトに進みます。
変数を収集するために使用したメソッドを以下に示します。教授はまた、for ループまでのすべてを提供してくれました。ご覧のとおり、for ループの最後で人を作成し、それを arrayList に入れました。これは正常に機能しています。ただし、約 14 人を作成、保存、および印刷することに成功した後、突然ランタイム エラーが発生します。
私はxCodeでプロジェクトを実行しました.これは私に与えるエラーです:
Project2(4244) malloc: *** error for object 0x100103c18: incorrect checksum for freed object - object was probably modified after being freed.
*** set a breakpoint in malloc_error_break to debug
明らかに、これはある種のメモリ管理の問題であることがわかりますが、それ以上のものではありません。オブジェクトが解放される理由がわかりません。そして、それが何らかの形で解放されたのなら、なぜ他の人は解放されなかったのですか? さらに、友人の友人リストを使用して、別のテキスト ファイルでプロジェクトを実行しようとしました。同じエラーが発生する前に、約 30 人を通過することができました。いったいなぜ、それが私の友人よりも彼の友人のほうが多いのだろうか?
どんな助けでも大歓迎です!この VJSON のことは本当に私の頭の上にあります。ありがとうございました!
arrayList createArrayList(string filename){
arrayList people;
ifstream fileInput(filename);
//turn input stream into string
// Black magic to turn input stream into string. Remember to include streambuf header
// This string constructor accepts an iterator to the start of the file input stream
// and another one that represents the end of input character (which is supplied by calling the default constructor of the iterator).
string inputStr((istreambuf_iterator<char>(fileInput)), istreambuf_iterator<char>());
//parse file content into json object
char *errorPos = 0;
char *errorDesc = 0;
int errorLine = 0;
block_allocator allocator(1 << 10);
json_value *root = json_parse(const_cast<char*>(inputStr.c_str()), &errorPos, &errorDesc, &errorLine, &allocator);
//get the first element, data, this value is an array of JSON objects (people)
json_value *list = root->first_child;
//This outer loop addresses each person's JSON object
for(json_value *it = list->first_child; it; it = it->next_sibling){
//This inner loop looks at each key/value pair within each person object
string first_name, last_name, birthday, hometownID, hometown, personIDstr;
for(json_value *personKeys = it->first_child; personKeys; personKeys = personKeys->next_sibling){
//If the key/value pair has a key of "first_name" collect value associated
if(!string(personKeys->name).compare("first_name")){
first_name = personKeys->string_value;
}
//collect last name
else if(!string(personKeys->name).compare("last_name")){
last_name = personKeys->string_value;
}
//collect birthday
else if(!string(personKeys->name).compare("birthday")){
birthday = personKeys->string_value;
//trim bday to first five characters
birthday = birthday.substr(0,5);
}
//collect hometown
else if(!string(personKeys->name).compare("hometown")){
for(json_value *homeKeys = personKeys->first_child; homeKeys; homeKeys = homeKeys->next_sibling){
if(!string(homeKeys->name).compare("id")){
hometownID = homeKeys->string_value;
}
if(!string(homeKeys->name).compare("name")){
hometown = homeKeys->string_value;
}
}
}
else if(!string(personKeys->name).compare("id")){
personIDstr = personKeys->string_value;
}
//create person object based on which values are included
}
Person person(birthday, first_name, last_name, hometown, 0);
cout << person << endl;
people.insert(people.size(), person);
cout << people.get(people.size()-1) << endl;
}
return people;
}