推荐:数据科学课程和书籍清单以及培训讲座


一亩三分地论坛

 找回密码
 获取更多干活,快来注册

一亩三分地官方iOS手机应用下载
查看: 3273|回复: 2
收起左侧

请教FB的一道onsite题

[复制链接] |试试Instant~ |关注本帖
yuxrose 发表于 2015-5-15 07:01:55 | 显示全部楼层 |阅读模式

2014(4-6月) 码农类 硕士 全职@Facebook - 内推 - Onsite |Other在职跳槽

注册一亩三分地论坛,查看更多干货!

您需要 登录 才可以下载或查看,没有帐号?获取更多干活,快来注册

x
设计json的data structure实现json encoding 要求one line version先不考虑indent,
follow up考虑indent和括号


----我觉得是不是可以用hashmap记录每一个pair, 当然value可以是另一个jsonobject
. 鐣欏鐢宠璁哄潧-涓浜╀笁鍒嗗湴
----encode的时候,是不是可以dfs traverse所有层,是不是可以需要一个iterator class?

本帖被以下淘专辑推荐:

eval 发表于 2015-5-15 08:42:52 | 显示全部楼层
关注一亩三分地公众号:
Warald_一亩三分地
我觉得最好先规范一下type hierarchy, 就像java的json API那样,有JsonObject, JsonElement, JsonArray, JsonPrimitive等. 然后自顶向下调用encoding过程;encoding函数根据不同的type做不同的操作,本质是个递归调用。
回复 支持 反对

使用道具 举报

Wizmann 发表于 2015-5-24 15:05:51 | 显示全部楼层
关注一亩三分地微博:
Warald

  1. #include <cstdio>
  2. #include <cstdlib>
  3. #include <cstring>
  4. #include <string>
  5. #include <iostream>. From 1point 3acres bbs
  6. #include <algorithm>
  7. #include <vector>
  8. #include <unordered_map>
  9. . more info on 1point3acres.com
  10. using namespace std;
  11. . 鐗涗汉浜戦泦,涓浜╀笁鍒嗗湴
  12. #define print(x) cout << x << endl
  13. #define input(x) cin >> x
  14. . 涓浜-涓夊垎-鍦帮紝鐙鍙戝竷
  15. class JsonObject {.1point3acres缃
  16. public:
  17.     virtual string str() = 0;
  18. };. 鐗涗汉浜戦泦,涓浜╀笁鍒嗗湴

  19. template <typename T>. 鍥磋鎴戜滑@1point 3 acres
  20. class JsonScalar: public JsonObject {
  21. public:. more info on 1point3acres.com
  22.     JsonScalar(T value): _value(value) {}
  23.     virtual string str() {. Waral 鍗氬鏈夋洿澶氭枃绔,
  24.         return to_string(_value);
  25.     }
  26. private:.鐣欏璁哄潧-涓浜-涓夊垎鍦
  27.     T _value;
  28. };
    . 1point 3acres 璁哄潧

  29. class JsonString: public JsonObject {
  30. public:
  31.     JsonString(const string& str): _str(str) {}
  32.     virtual string str() {
  33.         return "\"" + _str + "\"";
  34.     }. from: 1point3acres.com/bbs
  35. private:
  36.     string _str; 鏉ユ簮涓浜.涓夊垎鍦拌鍧.
  37. };

  38. class JsonArray: public JsonObject {
  39. public:
  40.     JsonArray() {}
    . From 1point 3acres bbs
  41.     JsonArray(const vector<JsonObject*> vec): _vec(vec) {}
  42.     virtual string str() {
  43.         string res = "[";. Waral 鍗氬鏈夋洿澶氭枃绔,
  44.         int cnt = 0;. From 1point 3acres bbs
  45.         for (auto p: _vec) {
  46.             if (cnt) {
  47.                 res += ", ";
  48.             }
  49.             res += p->str();
  50.             cnt++;
  51.         }
  52.         res += "]";
  53.         return res;
  54.     }
  55.     void add(JsonObject* object_p) {
  56.         _vec.push_back(object_p);
  57.     }
  58. private:
  59.     vector<JsonObject*> _vec;
  60. };


  61. class JsonDict: public JsonObject {
  62. public:-google 1point3acres
  63.     JsonDict() {}
  64.     JsonDict(const unordered_map<string, JsonObject*> mp): _mp(mp) {}. 鍥磋鎴戜滑@1point 3 acres
  65.     virtual string str() {. 涓浜-涓夊垎-鍦帮紝鐙鍙戝竷
  66.         string res = "{";. more info on 1point3acres.com
  67.         int cnt = 0;
  68.         for (auto pp: _mp) {
  69.             if (cnt) {
  70.                 res += ", ";
  71.             }
  72.             auto key = pp.first;
  73.             auto value = pp.second;. 1point3acres.com/bbs
  74.             res += "\"" + key + "\"";
  75.             res += ": ";
  76.             res += value->str();. Waral 鍗氬鏈夋洿澶氭枃绔,
  77.             cnt++;
  78.         }. from: 1point3acres.com/bbs
  79.         res += "}";
  80.         return res;
    . more info on 1point3acres.com
  81.     }
  82. . 鍥磋鎴戜滑@1point 3 acres
  83.     void add(const string& key, JsonObject* value) {
  84.         _mp[key] = value;
  85.     }
  86.    
  87.     void add(const char* key, JsonObject* value) {
  88.         _mp[key] = value;. 鍥磋鎴戜滑@1point 3 acres
  89.     }
  90. private:.鏈枃鍘熷垱鑷1point3acres璁哄潧
  91.     unordered_map<string, JsonObject*> _mp;
  92. };

  93. typedef JsonDict Json;


  94. int main() {
  95.     Json json;. 涓浜-涓夊垎-鍦帮紝鐙鍙戝竷
  96.     json.add("winfo_id", new JsonScalar<int>(1));
  97.     json.add("unit_id",  new JsonScalar<int>(2));
  98.     json.add("plan_id",  new JsonScalar<int>(3));
  99.     json.add("user_id",  new JsonScalar<int>(4));
  100.     json.add("url", new JsonString("i am not a url"));
  101.     json.add("bid", new JsonArray({
  102.         new JsonScalar<double>(1.1),. 鍥磋鎴戜滑@1point 3 acres
  103.         new JsonScalar<double>(1.2),
  104.         new JsonString("nineteen")
  105.     }));
  106.     json.add("wiseapp", new JsonDict({
  107.         {"Android", new JsonString("url for android")},. 1point 3acres 璁哄潧
  108.         {"iOS",     new JsonString("url for ios")},
  109.         {"WP",      new JsonString("404 not found")}
  110.     }));

  111.     print(json.str());.1point3acres缃

  112.     return 0;
  113. }


复制代码
没做内存处理。. From 1point 3acres bbs

在工程中就搞个内存池,用完统一回收就行。
. from: 1point3acres.com/bbs
shared_ptr也是个不错的选择。
回复 支持 反对

使用道具 举报

本版积分规则

关闭

一亩三分地推荐上一条 /5 下一条

手机版|小黑屋|一亩三分地论坛声明

custom counter

GMT+8, 2017-8-17 14:28

Powered by Discuz! X3

© 2001-2013 Comsenz Inc. Design By HUXTeam

快速回复 返回顶部 返回列表