Как получить значение JSON из 3 полей динамически зависит от передаваемого параметра - PullRequest
0 голосов
/ 25 марта 2019

Основная идея заключается в динамическом извлечении значения 3 полей в главной функции из Config.json, а именно Id, Encoding, Signature зависит от передаваемого Id.

Прежде всего, в файле Config.json:

Зависит от идентификатора, будет применен другой выбор

например. если Id 509 пройден: { «Id»: 509, «Кодировка»: «НЕТ-КОДИРОВАНИЕ», «Подпись»: «X509» }

будет применяться.

Config.json

{
    "SchemaIdForUsage":509,
    "Schema":[
        {
            "Id":100,
            "Encoding":"NO-ENCODING",
            "Signature":"MD5"
        },
        {
            "Id":509,
            "Encoding":"NO-ENCODING",
            "Signature":"X509"
        }
    ]
}

Я использовал приведенный ниже код для анализа JSON из Config.json:

test.cpp

#include <iostream>
#include <fstream>
#include <string>
using namespace std;

int getfile()
{
    string line;
    ifstream myfile("E:\\config.json");
    if (myfile.is_open())
    {
        while (myfile.good())
        {
            getline(myfile, line);
            cout << line << endl;
        }
        myfile.close();
    }
    else cout << "Unable to open file";
    system("pause");
    return 0;
}

int main()
{
    getfile();
    return 0;
}

Библиотека JSON

https://github.com/mrtazz/restclient-cpp

Надеюсь, я дал понять, как новичок в C ++. Мне интересно, какой лучший подход для динамического извлечения этих трех полей из файла JSON зависит от передаваемого идентификатора. Спасибо за вашу помощь.

Обновлен ответ: использование библиотеки restclient для анализа JSON

Я использовал приведенный ниже код, чтобы попытаться получить JSON

std::ifstream file_input("E:\\test.txt");
Json::Reader reader;
Json::Value root;
reader.parse(file_input, root);
std::cout<<root["Id"]; 
Json::Value testing = root["Schema"]["Id"];

В отладчике

enter image description here

Я пытаюсь получить значение полей Id например: 100, Encoding например "NO-ENCODING"

Там ошибка показывает необработанную ошибку

Любая идея будет принята с благодарностью. Спасибо,

1 Ответ

0 голосов
/ 26 марта 2019

try https://github.com/xyz347/x2struct

код:

#include <iostream>
#include "x2struct/x2struct.hpp"

using namespace std;

struct SchemaInfo {
    int Id;
    string Encoding;
    string Signature;
    XTOSTRUCT(O(Id, Encoding, Signature));
};

struct Test {
    int SchemaIdForUsage;
    SchemaInfo Schema;
    XTOSTRUCT(C(Schema), O(SchemaIdForUsage, Schema)); // load Schema conditional(when XTOSTRUCT_CONDITION(Test, Schema) return true)
    XTOSTRUCT_CONDITION(Test, Schema) {  // XTOSTRUCT_CONDITION(Schema) is a static function. take 2 parameters, self is this, and obj is SchemaInfo
    int  Id;
    return obj.convert("Id", Id)&&Id==this->SchemaIdForUsage; // obj pointer to SchemaInfo
}
};

int main(int argc, char*argv[]) {
    Test x;
    string jstr="{\"SchemaIdForUsage\":509,\"Schema\":[{\"Id\":100,\"Encoding\":\"NO-ENCODING\",\"Signature\":\"MD5\"},{\"Id\":509,\"Encoding\":\"NO-ENCODING\",\"Signature\":\"X509\"}]}";
    x2struct::X::loadjson(jstr, x, false);
    cout<<x.SchemaIdForUsage<<endl;
    cout<<x.Schema.  Id<<endl;
    cout<<x.Schema.Encoding<<endl;
    cout<<x.Schema.Signature<<endl;
    return 0;
}

вывод:

509
509
NO-ENCODING
X509
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...