将json解析为数据模型[是:C ++头文件设计]

时间:2018-01-07 11:55:14

标签: c++ json

我想解析json文件并将其存储在C ++类中。我需要帮助了解实现这一目标的最佳方法是什么?

test.json

{
  "vehicles": [
      {
         "type" : "car" :
           {
             "car1" :
               {
                 "name" : "merc-cla250",
                 "color" : "black",
                },
              "car2" :
               {
                 "name" : "toyota-prius",
                 "color" : "blue",
                },
            }
       },
       {
           "type" : "bike" :
              {
                "bike1" :
                  {
                     "name" : "windsor",
                     "color : "black",
                  },
                "bike2" : 
                  {
                     "name" : "diamond",
                     "color : "black",
                  },
              }
         }
    ]
} 

我想将这些信息存储在C ++的类中。在C中,我会定义一些结构并存储信息。我正在学习C ++。首先,我只是想设计头文件。我试过跟踪的事情。有人可以帮我改进吗?我知道,我写的是C风格,但我很感激有人可以帮我写出更好的C ++方式。有一次,我会写头文件,我将开始编写cpp文件。提前致谢!感谢您的时间和帮助!

vehicle_json.h

#ifndef __VEHICLE_H__
#define __VEHICLE_H__

#include <iostream>
#include <cstdlib>

class vehicle
{
public:
    const std::string& getType(void);
private:
   std::string type;
   carList& carsInfo;       // Can I do this?
   bikeList& bikesInfo;
};

class car
{
public:
    const std::string& getName(void);
    const std::string& getType(void);
private:
   std::string name;
   std::string color;
};
typedef std::vector<car> carList;        

class bike
{
public:
    const std::string& getName(void);
    const std::string& getType(void);
private:
   std::string name;
   std::string color;
};
typedef std::vector<bike> bikeList;

#endif // __VEHICLE_H__

1 个答案:

答案 0 :(得分:0)

嗯,在相当正式的层面上有一些错误:

  • 标识符,例如保留两个连续的下划线,你不应该使用它们,甚至不包括保护。
  • using namespace std;会强制所有std加入任何人,包括该头文件,也不要这样做。然后你继续在任何地方使用std::,这是矛盾的。但是,请放弃using ..,但保留std::
  • 没有参数的函数在C ++中不需要显式void。在C中,需要明确说明。
  • car不是vehicle吗?我认为它应该是一个基础类。
  • 是的,您可以使用引用作为成员变量,但必须在构造函数中初始化它们。我只为参考会员提供了一些好的用例,我不认为这是其中之一。
  • some_car.getCarName() - 为什么要在函数名中重复这个类?我会改用some_car.getName()。实际上,请设置some_vehicle.getName(),它符合上面建议的基类。
  • 您写道,您首先要编写头文件然后执行。不要那样做。相反,首先将代码全部写入,然后提取标题以供其他代码使用。原因是这些是可以独立完成的两个独立任务。如果你混合它们,你会得到一个更大的复杂任务,对于初学者来说可能太多了。

现在,关于你的JSON问题:这里没有什么需要JSON!更重要的是,如果您的类不依赖于任何特定的JSON表示,则更可取。相反,请考虑一个简单的函数:parse_vehicle_json(std::istream& in)。在该函数内部,读取并解析输入为JSON,然后从中提取车辆列表。请注意,C ++容器不是多态的,因此您无法在car中存储vector<vehicle>,而是必须使用(优选“智能”)指针进行动态分配。