feat:引入人脸识别sdk
This commit is contained in:
1 parent
ce16eaf82e
commit
158d012eff
331 files changed
+13539
No files matched your search
+24
@@ -0,0 +1,24 @@
|
||||
//
|
||||
// Created on 2024/4/3.
|
||||
//
|
||||
// Node APIs are not fully supported. To solve the compilation error of the interface cannot be found,
|
||||
// please include "napi/native_api.h".
|
||||
|
||||
#ifndef HARMONYFACEVERIFY_IMAGEUTILS_H
|
||||
#define HARMONYFACEVERIFY_IMAGEUTILS_H
|
||||
#include "BlobTypes.h"
|
||||
#include "FaceBlobTypes.h"
|
||||
namespace dtf {
|
||||
class ImageUtils {
|
||||
public:
|
||||
static std::string Rotate(const Image *in, int angle, Image *out);
|
||||
static std::string Crop(const Image *in, Rect rect, Image *out);
|
||||
static std::string Scale(const Image *in, double x, double y, Image *out);
|
||||
static std::string Packing(const Image *in, double compress_rate, Image *out);
|
||||
static std::string YUV2RGB(const Image *in, Image *out);
|
||||
static std::string BGRA2RGB(const Image *in, Image *out);
|
||||
static void Release(Image *image);
|
||||
};
|
||||
}
|
||||
|
||||
#endif //HARMONYFACEVERIFY_IMAGEUTILS_H
|
||||
+57
@@ -0,0 +1,57 @@
|
||||
//
|
||||
// Created on 2024/4/2.
|
||||
//
|
||||
// Node APIs are not fully supported. To solve the compilation error of the interface cannot be found,
|
||||
// please include "napi/native_api.h".
|
||||
|
||||
#ifndef HARMONYFACEVERIFY_BLOBMANAGER_H
|
||||
#define HARMONYFACEVERIFY_BLOBMANAGER_H
|
||||
|
||||
#include "FaceBlobTypes.h"
|
||||
#include "BlobImageUtil.h"
|
||||
#include "BlobTypes.h"
|
||||
|
||||
namespace dtf {
|
||||
|
||||
struct BlobConfig {
|
||||
double compress_rate;
|
||||
double desired_width;
|
||||
bool need_enc_content;
|
||||
bool need_enc_image;
|
||||
int retry_count;
|
||||
std::string upload_image_type;
|
||||
std::string bis_token;
|
||||
std::vector<std::string> collection;
|
||||
|
||||
// 加密配置
|
||||
int aesKeyLen = 0;
|
||||
std::string rsaMod = "";
|
||||
std::string rsaExp = "";
|
||||
|
||||
void SetDefault();
|
||||
void ParseConfig(Json config_json);
|
||||
};
|
||||
|
||||
#ifdef DT_REQUEST_BLOB
|
||||
|
||||
class BlobManager {
|
||||
|
||||
public:
|
||||
BlobConfig config;
|
||||
std::string aes_key_cipher;
|
||||
std::string aes_key;
|
||||
int metaSerializer;
|
||||
BlobManager(BlobConfig config);
|
||||
~BlobManager();
|
||||
virtual FaceBlobContentResult GenerateBlob(std::vector<FaceFrame> &frames, const std::map<std::string, std::string> &ext);
|
||||
virtual BlobMeta GenerateMeta(const std::map<std::string, std::string> &ext);
|
||||
virtual std::string ToString(FaceBlobContentResult &result);
|
||||
std::string ProcessImage(Image &image, Image *out, Image *out_encrypted);
|
||||
std::string ProcessImage(Image &image, double compress_rate, Rect roi);
|
||||
};
|
||||
|
||||
#endif
|
||||
|
||||
}
|
||||
|
||||
#endif //HARMONYFACEVERIFY_BLOBMANAGER_H
|
||||
+126
@@ -0,0 +1,126 @@
|
||||
#ifndef BLOBPACKCONTROLLER_H
|
||||
#define BLOBPACKCONTROLLER_H
|
||||
|
||||
#include <vector>
|
||||
#include <map>
|
||||
#include "dt_json11.hpp"
|
||||
#include "BlobManager.h"
|
||||
#include "BlobTypes.h"
|
||||
#include "DTEncrypt.h"
|
||||
|
||||
using namespace std;
|
||||
|
||||
namespace dtf {
|
||||
|
||||
class BlobPackController {
|
||||
public:
|
||||
BlobPackController();
|
||||
|
||||
~BlobPackController();
|
||||
|
||||
/**
|
||||
* @brief config 配置数据打包控制器
|
||||
* @param config 图像压缩率&密钥等数据
|
||||
*/
|
||||
void config(BlobConfig &config);
|
||||
|
||||
/**
|
||||
* @brief cacheBlobContent 缓存人脸识别结果数据
|
||||
* @param bestImage 最佳人脸图
|
||||
* @param extraImages 额外采集人脸图片(动作:图片序列)
|
||||
* @param ext 额外的配置(可不传)
|
||||
*/
|
||||
void cacheBlobContent(FaceFrame &bestImage,
|
||||
vector<pair<string, vector<FaceFrame>>> extraImages = vector<pair<string, vector<FaceFrame>>>(),
|
||||
map<string, string> ext = map<string, string>());
|
||||
|
||||
/**
|
||||
* @brief encryptExtraImages 加密额外数据图
|
||||
* @param quality 图片质量
|
||||
* @return 处理后的照片(动作:原始数据&jpeg图片&加密图片)
|
||||
*/
|
||||
vector<pair<string, vector<FaceFrame>>> encryptExtraImages(float quality = 70);
|
||||
|
||||
/**
|
||||
* @brief encryptBestImage 加密最佳人脸图
|
||||
* @param quality 图片质量
|
||||
* @return 原始数据&jpeg图片&加密图片
|
||||
*/
|
||||
FaceFrame encryptBestImage(float quality = 70);
|
||||
|
||||
/**
|
||||
* @brief signCollectionInfo 对CollectInfo签名
|
||||
* @param param 额外参数 {"multipic_zfaceBlinkLiveness_video":"123123123123","multipic_LeftYawLiveness_video":"123123123123"}
|
||||
* @return 签名加密数据
|
||||
*/
|
||||
string signCollectionInfo(string param);
|
||||
|
||||
/**
|
||||
* @brief geneateBlob 生成报文blob
|
||||
* @return 认证报文
|
||||
*/
|
||||
string geneateBlob();
|
||||
|
||||
/**
|
||||
* @brief getContentSignature 获取ContentSig,RSA加密密钥
|
||||
* @return 字符串
|
||||
*/
|
||||
string getContentSignature();
|
||||
|
||||
/**
|
||||
* @brief release 数据清除
|
||||
*/
|
||||
void release();
|
||||
|
||||
protected:
|
||||
/**
|
||||
* @brief encryptImage 图像加密
|
||||
* @param frame 帧数据
|
||||
* @param quality 图片质量
|
||||
* @return
|
||||
*/
|
||||
FaceFrame encryptImage(FaceFrame &frame, float quality = 70);
|
||||
|
||||
/**
|
||||
* @brief imageRelease 图片释放
|
||||
* @param frame 帧
|
||||
*/
|
||||
void imageRelease(FaceFrame &frame);
|
||||
|
||||
/**
|
||||
* @brief generateCollectionInfo 生成CollectInfo信息
|
||||
* @param param 外部生成生成CollectInfo
|
||||
* @return 补充图片MD5数据后的CollectInfo
|
||||
*/
|
||||
string generateCollectionInfo(string param);
|
||||
|
||||
private:
|
||||
/**
|
||||
* @brief contentEncrypt 图片内容加密
|
||||
*/
|
||||
DTEncrypt contentEncrypt;
|
||||
/**
|
||||
* @brief behavelogEncrypt behavelog加密
|
||||
*/
|
||||
DTEncrypt behavelogEncrypt;
|
||||
/**
|
||||
* @brief bestImage 最佳人脸图
|
||||
*/
|
||||
FaceFrame bestImage;
|
||||
/**
|
||||
* @brief extraImages 额外数据
|
||||
*/
|
||||
vector<pair<string, vector<FaceFrame>>> extraImages;
|
||||
/**
|
||||
* @brief blobConfig 报文配置
|
||||
*/
|
||||
BlobConfig blobConfig;
|
||||
/**
|
||||
* @brief blobContentExtra 额外参数
|
||||
*/
|
||||
map<string, string> blobContentExtra;
|
||||
};
|
||||
|
||||
}
|
||||
|
||||
#endif //BLOBPACKCONTROLLER_H
|
||||
+122
@@ -0,0 +1,122 @@
|
||||
//
|
||||
// Created on 2024/4/2.
|
||||
//
|
||||
// Node APIs are not fully supported. To solve the compilation error of the interface cannot be found,
|
||||
// please include "napi/native_api.h".
|
||||
|
||||
#ifndef HARMONYFACEVERIFY_BLOBMODEL_H
|
||||
#define HARMONYFACEVERIFY_BLOBMODEL_H
|
||||
|
||||
#include "dt_json11.hpp"
|
||||
#include <string>
|
||||
|
||||
namespace dtf {
|
||||
|
||||
struct ImageTypeConstant {
|
||||
static const int YUV;
|
||||
static const int RGB;
|
||||
static const int BGRA;
|
||||
static const int RGBA;
|
||||
static const int BGR;
|
||||
};
|
||||
|
||||
struct BlobConstant {
|
||||
static const std::string BLOB_VERSION;
|
||||
static const std::string SUB_TYPE_PANO;
|
||||
static const std::string BLOB_ELEM_TYPE_FACE;
|
||||
static const std::string SUB_TYPE_VERSION;
|
||||
static const std::string PUB_KEY_N;
|
||||
static const std::string PUB_KEY_E;
|
||||
};
|
||||
|
||||
struct BlobPackConstant {
|
||||
static const std::string EXT_NAME;
|
||||
};
|
||||
|
||||
#ifdef DT_REQUEST_BLOB
|
||||
|
||||
struct MetaConstant {
|
||||
|
||||
static const std::string VAL_TYPE_FACE;
|
||||
|
||||
static const std::string KEY_INVTP_TYPE;
|
||||
static const std::string KEY_BIS_TOKEN;
|
||||
static const std::string KEY_EXTRA_RETRY;
|
||||
static const std::string KEY_EXTRA;
|
||||
static const std::string KEY_DRAGONFLY;
|
||||
static const std::string KEY_DRAGONFLY_PASS;
|
||||
static const std::string KEY_PHOTINUS_VIDEO_OSS_NAME;
|
||||
static const std::string KEY_PHOTINUS_METADATA_OSS_NAME;
|
||||
|
||||
static const std::string VAL_INVTP_TYPE_NORMAL;
|
||||
|
||||
// static constexpr int VAL_DRAGONFLY_PASS_SUCCESS = 1;
|
||||
|
||||
static constexpr int VAL_SERIALIZER_JSON = 1;
|
||||
static constexpr int VAL_SERIALIZER_PB = 2;
|
||||
|
||||
//TS层传入的参数key
|
||||
static const std::string PARAM_PHOTINUS_VIDEO_OSS_NAME;
|
||||
static const std::string PARAM_PHOTINUS_METADATA_OSS_NAME;
|
||||
static const std::string PARAM_BLOB_USE_NATIVE_SWITCH;
|
||||
};
|
||||
|
||||
#endif
|
||||
|
||||
struct Point {
|
||||
double x;
|
||||
double y;
|
||||
};
|
||||
|
||||
struct Rect {
|
||||
double left;
|
||||
double right;
|
||||
double top;
|
||||
double bottom;
|
||||
Rect() {}
|
||||
Rect(double left, double right, double top, double bottom) {
|
||||
this->left = left;
|
||||
this->right = right;
|
||||
this->top = top;
|
||||
this->bottom = bottom;
|
||||
}
|
||||
};
|
||||
|
||||
struct Image {
|
||||
uint8_t *data = nullptr;
|
||||
int rotation;
|
||||
double width;
|
||||
double height;
|
||||
long len = 0;
|
||||
int format;
|
||||
bool encrypted = false;
|
||||
std::string base64 = "";
|
||||
std::string md5 = "";
|
||||
};
|
||||
|
||||
#ifdef DT_REQUEST_BLOB
|
||||
|
||||
struct BlobMeta {
|
||||
std::string type;
|
||||
std::map<std::string,std::string> collectInfo;
|
||||
std::map<std::string, int> score;
|
||||
int serialize;
|
||||
std::string invtp_type;
|
||||
std::string bistoken;
|
||||
std::map<std::string,std::string> extInfo;
|
||||
};
|
||||
|
||||
struct BlobElem {
|
||||
BlobElem(){}
|
||||
std::string type;
|
||||
std::string subType;
|
||||
int idx;
|
||||
std::string version;
|
||||
std::string content;
|
||||
};
|
||||
|
||||
#endif
|
||||
|
||||
} // namespace dtf
|
||||
|
||||
#endif //HARMONYFACEVERIFY_BLOBMODEL_H
|
||||
+135
@@ -0,0 +1,135 @@
|
||||
//
|
||||
// Created by CandleWen on 2023/7/24.
|
||||
//
|
||||
|
||||
#ifndef VERIFY_DTENCRYPT_H
|
||||
#define VERIFY_DTENCRYPT_H
|
||||
|
||||
#include <string>
|
||||
|
||||
using namespace std;
|
||||
|
||||
namespace dtf
|
||||
{
|
||||
/**
|
||||
* AES & RSA 加密以及秘钥加密
|
||||
* 人脸数据加密类
|
||||
*/
|
||||
class DTEncrypt
|
||||
{
|
||||
public:
|
||||
/**
|
||||
* RSA加密数据
|
||||
* @param mod PK modulus
|
||||
* @param exp PK exponent
|
||||
* @param content 加密内容
|
||||
* @param out 输出内容
|
||||
* @param out_len 输出长度
|
||||
*/
|
||||
static void rsa_encrypt_content(const string &mod, const string &exp, const string &content,
|
||||
unsigned char **out, size_t *out_len);
|
||||
|
||||
/**
|
||||
* RSA加密数据,返回base64的字符串
|
||||
* @param mod PK modulus
|
||||
* @param exp PK exponent
|
||||
* @param content 加密内容
|
||||
*/
|
||||
static string base64_rsa_encrypt_content(const string &mod, const string &exp, const string &content);
|
||||
|
||||
/**
|
||||
* AES加密
|
||||
* @param giv
|
||||
* @param in 输入内容
|
||||
* @param in_len 输入内容长度
|
||||
* @param key key
|
||||
* @param out 输出内容
|
||||
* @param out_len 输出内容长度
|
||||
*/
|
||||
static void aes_encrypt(const string &giv, const unsigned char *in, size_t in_len, const string &key,
|
||||
unsigned char **out, size_t *out_len, uint8_t *iv = 0);
|
||||
|
||||
/**
|
||||
* AES解密
|
||||
* @param giv
|
||||
* @param in 输入内容
|
||||
* @param in_len 输入内容长度
|
||||
* @param key key
|
||||
* @param out 输出内容
|
||||
* @param out_len 输出内容长度
|
||||
*/
|
||||
static void aes_decrypt(const string &giv, const unsigned char *in, size_t in_len, const string &key,
|
||||
unsigned char **out, size_t *out_len, uint8_t *iv = 0);
|
||||
|
||||
/**
|
||||
* 初始化
|
||||
* @param aes_key_len AES加密秘钥长度
|
||||
* @param mod RSA公钥modulus
|
||||
* @param exp RSA公钥exponent
|
||||
*/
|
||||
DTEncrypt(int aes_key_len, string mod, string exp);
|
||||
|
||||
DTEncrypt();
|
||||
|
||||
/**
|
||||
* @brief init 重新初始化key
|
||||
* @param aes_key_len key长度
|
||||
* @param mod RSA公钥modulus
|
||||
* @param exp RSA公钥exponent
|
||||
*/
|
||||
void init(int aes_key_len, string mod, string exp);
|
||||
|
||||
/**
|
||||
* aes 加密 key
|
||||
* @return
|
||||
*/
|
||||
string get_encrypt_key();
|
||||
|
||||
/**
|
||||
* 对Content进行AES加密并返回Base64之后的加密字符串
|
||||
* @param content 待加密内容
|
||||
* @param content_len 待加密内容长度
|
||||
* @return
|
||||
*/
|
||||
string base64_encrypt_content(const unsigned char *content, size_t content_len);
|
||||
|
||||
/**
|
||||
* 对content内容进行AES加密
|
||||
* @param content 加密内容
|
||||
* @return base64之后的加密字符串
|
||||
*/
|
||||
string base64_encrypt_content(const string &content);
|
||||
|
||||
/**
|
||||
* @brief DTEncrypt::encrypt_content 对content内容进行AES加密
|
||||
* @param content
|
||||
* @param content_len
|
||||
* @param output_len
|
||||
* @return
|
||||
*/
|
||||
unsigned char *encrypt_content(const unsigned char *content, size_t content_len, size_t &output_len);
|
||||
|
||||
/**
|
||||
* 对加密且base64之后的字符串进行解密,并做base64返回
|
||||
* @param encrypt_content 待解密字符串
|
||||
* @return 解密之后base64内容
|
||||
*/
|
||||
string base64_decrypt_content(const string &encrypt_content);
|
||||
|
||||
private:
|
||||
/**
|
||||
* AES 加密秘钥
|
||||
*/
|
||||
string aes_key;
|
||||
/**
|
||||
* RSA 对 AES 加密后数据
|
||||
*/
|
||||
string encrypt_base64_key;
|
||||
/**
|
||||
* AES IV信息
|
||||
*/
|
||||
string giv;
|
||||
};
|
||||
}
|
||||
|
||||
#endif // VERIFY_DTENCRYPT_H
|
||||
+67
@@ -0,0 +1,67 @@
|
||||
//
|
||||
// Created on 2024/4/7.
|
||||
//
|
||||
// Node APIs are not fully supported. To solve the compilation error of the interface cannot be found,
|
||||
// please include "napi/native_api.h".
|
||||
|
||||
#ifndef HARMONYFACEVERIFY_FACEBLOBTYPES_H
|
||||
#define HARMONYFACEVERIFY_FACEBLOBTYPES_H
|
||||
|
||||
#include "BlobTypes.h"
|
||||
|
||||
namespace dtf {
|
||||
|
||||
struct FaceAttr {
|
||||
Rect face_region;
|
||||
float quality;
|
||||
float confidence;
|
||||
};
|
||||
|
||||
struct FaceInfo {
|
||||
Rect rect;
|
||||
std::vector<Point> points;
|
||||
float confidence;
|
||||
float quality;
|
||||
std::string feature;
|
||||
std::string feaVersion;
|
||||
};
|
||||
|
||||
struct FaceFrame {
|
||||
Image image;
|
||||
Image jpegImage;
|
||||
Image encryptImage;
|
||||
FaceAttr attr;
|
||||
std::map<std::string, std::string> extras;
|
||||
};
|
||||
|
||||
#ifdef DT_REQUEST_BLOB
|
||||
|
||||
struct FaceBlobElem : public BlobElem {
|
||||
std::vector<FaceInfo> face_infos;
|
||||
std::string return_image; //不加密的返照图
|
||||
};
|
||||
|
||||
struct FaceBlob {
|
||||
std::string blob_version;
|
||||
std::vector<FaceBlobElem> blob_elem;
|
||||
};
|
||||
|
||||
struct FaceBlobContent {
|
||||
FaceBlob blob;
|
||||
BlobMeta meta;
|
||||
};
|
||||
|
||||
struct FaceBlobContentResult {
|
||||
FaceBlobContent blob;
|
||||
std::vector<std::string> blob_content;
|
||||
std::vector<std::string> return_image;
|
||||
};
|
||||
|
||||
#endif
|
||||
}
|
||||
|
||||
class FaceBlobTypes {
|
||||
|
||||
};
|
||||
|
||||
#endif //HARMONYFACEVERIFY_FACEBLOBTYPES_H
|
||||
+232
@@ -0,0 +1,232 @@
|
||||
/* json11
|
||||
*
|
||||
* json11 is a tiny JSON library for C++11, providing JSON parsing and serialization.
|
||||
*
|
||||
* The core object provided by the library is json11::Json. A Json object represents any JSON
|
||||
* value: null, bool, number (int or double), string (std::string), array (std::vector), or
|
||||
* object (std::map).
|
||||
*
|
||||
* Json objects act like values: they can be assigned, copied, moved, compared for equality or
|
||||
* order, etc. There are also helper methods Json::dump, to serialize a Json to a string, and
|
||||
* Json::parse (static) to parse a std::string as a Json object.
|
||||
*
|
||||
* Internally, the various types of Json object are represented by the JsonValue class
|
||||
* hierarchy.
|
||||
*
|
||||
* A note on numbers - JSON specifies the syntax of number formatting but not its semantics,
|
||||
* so some JSON implementations distinguish between integers and floating-point numbers, while
|
||||
* some don't. In json11, we choose the latter. Because some JSON implementations (namely
|
||||
* Javascript itself) treat all numbers as the same type, distinguishing the two leads
|
||||
* to JSON that will be *silently* changed by a round-trip through those implementations.
|
||||
* Dangerous! To avoid that risk, json11 stores all numbers as double internally, but also
|
||||
* provides integer helpers.
|
||||
*
|
||||
* Fortunately, double-precision IEEE754 ('double') can precisely store any integer in the
|
||||
* range +/-2^53, which includes every 'int' on most systems. (Timestamps often use int64
|
||||
* or long long to avoid the Y2038K problem; a double storing microseconds since some epoch
|
||||
* will be exact for +/- 275 years.)
|
||||
*/
|
||||
|
||||
/* Copyright (c) 2013 Dropbox, Inc.
|
||||
*
|
||||
* Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
* of this software and associated documentation files (the "Software"), to deal
|
||||
* in the Software without restriction, including without limitation the rights
|
||||
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||
* copies of the Software, and to permit persons to whom the Software is
|
||||
* furnished to do so, subject to the following conditions:
|
||||
*
|
||||
* The above copyright notice and this permission notice shall be included in
|
||||
* all copies or substantial portions of the Software.
|
||||
*
|
||||
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
||||
* THE SOFTWARE.
|
||||
*/
|
||||
|
||||
#pragma once
|
||||
|
||||
#include <string>
|
||||
#include <vector>
|
||||
#include <map>
|
||||
#include <memory>
|
||||
#include <initializer_list>
|
||||
|
||||
#ifdef _MSC_VER
|
||||
#if _MSC_VER <= 1800 // VS 2013
|
||||
#ifndef noexcept
|
||||
#define noexcept throw()
|
||||
#endif
|
||||
|
||||
#ifndef snprintf
|
||||
#define snprintf _snprintf_s
|
||||
#endif
|
||||
#endif
|
||||
#endif
|
||||
|
||||
namespace dtf {
|
||||
|
||||
enum JsonParse {
|
||||
STANDARD, COMMENTS
|
||||
};
|
||||
|
||||
class JsonValue;
|
||||
|
||||
class Json final {
|
||||
public:
|
||||
// Types
|
||||
enum Type {
|
||||
NUL, NUMBER, BOOL, STRING, ARRAY, OBJECT
|
||||
};
|
||||
|
||||
// Array and object typedefs
|
||||
typedef std::vector<Json> array;
|
||||
typedef std::map<std::string, Json> object;
|
||||
|
||||
// Constructors for the various types of JSON value.
|
||||
Json() noexcept; // NUL
|
||||
Json(std::nullptr_t) noexcept; // NUL
|
||||
Json(double value); // NUMBER
|
||||
Json(int value); // NUMBER
|
||||
Json(bool value); // BOOL
|
||||
Json(const std::string &value); // STRING
|
||||
Json(std::string &&value); // STRING
|
||||
Json(const char * value); // STRING
|
||||
Json(const array &values); // ARRAY
|
||||
Json(array &&values); // ARRAY
|
||||
Json(const object &values); // OBJECT
|
||||
Json(object &&values); // OBJECT
|
||||
|
||||
// Implicit constructor: anything with a to_json() function.
|
||||
template <class T, class = decltype(&T::to_json)>
|
||||
Json(const T & t) : Json(t.to_json()) {}
|
||||
|
||||
// Implicit constructor: map-like objects (std::map, std::unordered_map, etc)
|
||||
template <class M, typename std::enable_if<
|
||||
std::is_constructible<std::string, decltype(std::declval<M>().begin()->first)>::value
|
||||
&& std::is_constructible<Json, decltype(std::declval<M>().begin()->second)>::value,
|
||||
int>::type = 0>
|
||||
Json(const M & m) : Json(object(m.begin(), m.end())) {}
|
||||
|
||||
// Implicit constructor: vector-like objects (std::list, std::vector, std::set, etc)
|
||||
template <class V, typename std::enable_if<
|
||||
std::is_constructible<Json, decltype(*std::declval<V>().begin())>::value,
|
||||
int>::type = 0>
|
||||
Json(const V & v) : Json(array(v.begin(), v.end())) {}
|
||||
|
||||
// This prevents Json(some_pointer) from accidentally producing a bool. Use
|
||||
// Json(bool(some_pointer)) if that behavior is desired.
|
||||
Json(void *) = delete;
|
||||
|
||||
// Accessors
|
||||
Type type() const;
|
||||
|
||||
bool is_null() const { return type() == NUL; }
|
||||
bool is_number() const { return type() == NUMBER; }
|
||||
bool is_bool() const { return type() == BOOL; }
|
||||
bool is_string() const { return type() == STRING; }
|
||||
bool is_array() const { return type() == ARRAY; }
|
||||
bool is_object() const { return type() == OBJECT; }
|
||||
|
||||
// Return the enclosed value if this is a number, 0 otherwise. Note that json11 does not
|
||||
// distinguish between integer and non-integer numbers - number_value() and int_value()
|
||||
// can both be applied to a NUMBER-typed object.
|
||||
double number_value() const;
|
||||
int int_value() const;
|
||||
|
||||
// Return the enclosed value if this is a boolean, false otherwise.
|
||||
bool bool_value() const;
|
||||
// Return the enclosed string if this is a string, "" otherwise.
|
||||
const std::string &string_value() const;
|
||||
// Return the enclosed std::vector if this is an array, or an empty vector otherwise.
|
||||
const array &array_items() const;
|
||||
// Return the enclosed std::map if this is an object, or an empty map otherwise.
|
||||
const object &object_items() const;
|
||||
|
||||
// Return a reference to arr[i] if this is an array, Json() otherwise.
|
||||
const Json & operator[](size_t i) const;
|
||||
// Return a reference to obj[key] if this is an object, Json() otherwise.
|
||||
const Json & operator[](const std::string &key) const;
|
||||
|
||||
// Serialize.
|
||||
void dump(std::string &out) const;
|
||||
std::string dump() const {
|
||||
std::string out;
|
||||
dump(out);
|
||||
return out;
|
||||
}
|
||||
|
||||
// Parse. If parse fails, return Json() and assign an error message to err.
|
||||
static Json parse(const std::string & in,
|
||||
std::string & err,
|
||||
JsonParse strategy = JsonParse::STANDARD);
|
||||
static Json parse(const char * in,
|
||||
std::string & err,
|
||||
JsonParse strategy = JsonParse::STANDARD) {
|
||||
if (in) {
|
||||
return parse(std::string(in), err, strategy);
|
||||
} else {
|
||||
err = "null input";
|
||||
return nullptr;
|
||||
}
|
||||
}
|
||||
// Parse multiple objects, concatenated or separated by whitespace
|
||||
static std::vector<Json> parse_multi(
|
||||
const std::string & in,
|
||||
std::string::size_type & parser_stop_pos,
|
||||
std::string & err,
|
||||
JsonParse strategy = JsonParse::STANDARD);
|
||||
|
||||
static inline std::vector<Json> parse_multi(
|
||||
const std::string & in,
|
||||
std::string & err,
|
||||
JsonParse strategy = JsonParse::STANDARD) {
|
||||
std::string::size_type parser_stop_pos;
|
||||
return parse_multi(in, parser_stop_pos, err, strategy);
|
||||
}
|
||||
|
||||
bool operator== (const Json &rhs) const;
|
||||
bool operator< (const Json &rhs) const;
|
||||
bool operator!= (const Json &rhs) const { return !(*this == rhs); }
|
||||
bool operator<= (const Json &rhs) const { return !(rhs < *this); }
|
||||
bool operator> (const Json &rhs) const { return (rhs < *this); }
|
||||
bool operator>= (const Json &rhs) const { return !(*this < rhs); }
|
||||
|
||||
/* has_shape(types, err)
|
||||
*
|
||||
* Return true if this is a JSON object and, for each item in types, has a field of
|
||||
* the given type. If not, return false and set err to a descriptive message.
|
||||
*/
|
||||
typedef std::initializer_list<std::pair<std::string, Type>> shape;
|
||||
bool has_shape(const shape & types, std::string & err) const;
|
||||
|
||||
private:
|
||||
std::shared_ptr<JsonValue> m_ptr;
|
||||
};
|
||||
|
||||
// Internal class hierarchy - JsonValue objects are not exposed to users of this API.
|
||||
class JsonValue {
|
||||
protected:
|
||||
friend class Json;
|
||||
friend class JsonInt;
|
||||
friend class JsonDouble;
|
||||
virtual Json::Type type() const = 0;
|
||||
virtual bool equals(const JsonValue * other) const = 0;
|
||||
virtual bool less(const JsonValue * other) const = 0;
|
||||
virtual void dump(std::string &out) const = 0;
|
||||
virtual double number_value() const;
|
||||
virtual int int_value() const;
|
||||
virtual bool bool_value() const;
|
||||
virtual const std::string &string_value() const;
|
||||
virtual const Json::array &array_items() const;
|
||||
virtual const Json &operator[](size_t i) const;
|
||||
virtual const Json::object &object_items() const;
|
||||
virtual const Json &operator[](const std::string &key) const;
|
||||
virtual ~JsonValue() {}
|
||||
};
|
||||
|
||||
} // namespace dtf
|
||||
Reference in new issue
Block a user