2

メイン関数で定義された JSON Stingrg から配列を取得しようとしています。これにはlibjson APIを使用しました。単純なキー値は簡単に取得できるため、RootAの値を取得できますが、ChildAのこの配列はどうですか。私にお知らせください

#include <iostream>
#include <libjson/libjson.h>
#include <stdio.h>
#include <string.h>

using namespace std;

char rootA[20];
int childB;
int *childInt;

void ParseJSON(JSONNODE *n) {
    if (n == NULL) {
        printf("Invalid JSON Node\n");
        return;
    }

    JSONNODE_ITERATOR i = json_begin(n);
    while (i != json_end(n)) {
        if (*i == NULL) {
            printf("Invalid JSON Node\n");
            return;
        }

        // recursively call ourselves to dig deeper into the tree
        if (json_type(*i) == JSON_ARRAY || json_type(*i) == JSON_NODE) {
            ParseJSON(*i);
        }

        // get the node name and value as a string
        json_char *node_name = json_name(*i);

        // find out where to store the values
        if (strcmp(node_name, "RootA") == 0) {
            json_char *node_value = json_as_string(*i);
            strcpy(rootA, node_value);
            cout << rootA<<"\n";
            json_free(node_value);
        } else if (strcmp(node_name, "ChildA") == 0) {
            JSONNODE *node_value = json_as_array(*i);

            childInt=reinterpret_cast<int *>(&node_value);
            cout << childInt[0]<<"\n";
            cout << childInt[1]<<"\n";
            json_free(node_value);
        } else if (strcmp(node_name, "ChildB") == 0) {
            childB = json_as_int(*i);
            cout << childB;
        }
        // cleanup and increment the iterator
        json_free(node_name);
        ++i;
    }
}

int main(int argc, char **argv) {
    char
            *json =
                    "{\"RootA\":\"Value in parent node\",\"ChildNode\":{\"ChildA\":[1,2],\"ChildB\":42}}";
    JSONNODE *n = json_parse(json);
    ParseJSON(n);
    json_delete(n);
    return 0;
}
4

2 に答える 2

1

ありがとうございます

わかりました...配列をノードとして扱い、空のキーを持つ値であるかのようにもう一度繰り返します。それを行ったコード部分を見ることができます..

if (json_type(*i) == JSON_ARRAY) {
    cout << "\n Its a Json Array";
    JSONNODE *arrayValue = json_as_array(*i);
    JSONNODE_ITERATOR i1 = json_begin(arrayValue);
    while (i1 != json_end(arrayValue)) {
            cout << "\n In Array Loop ";
        cout << json_as_int(*i1);
        ++i1;
    }
}
于 2013-06-17T08:21:24.790 に答える
0

これはおそらくあなたが探していた答えではありませんが、少し最新のインターフェイスを備えたライブラリを使用すると、これがはるかに簡単になることを示しましょう ( test.cpp ):

#include <sstream>
#include "JSON.hpp"

int main()
{
    auto document = JSON::readFrom(std::istringstream(
                "{\"RootA\":\"Value in parent node\",\"ChildNode\":{\"ChildA\":[1,2],\"ChildB\":42}}"));

    auto childA = as_object(
                as_object(document)[L"ChildNode"]
            )[L"ChildA"];

    std::cout << childA << std::endl;
}

どのプリント

[1,2]

rfc4627仕様の私自身の最小限の実装を使用しています。完全な構文と UNICODE をサポートする、インターフェイスのみのミニマリストです。

API インターフェイスはかなり制限されていますが、C スタイルのポインターを使用せずに、適切な辞書検索、キー比較などを使用すると、退屈でエラーが発生しにくくなることが既にわかります。

// or use each value
for(auto& value : as_array(childA).values)
    std::cout << value << std::endl;

// more advanced:
JSON::Value expected = JSON::Object {
    { L"RootA", L"Value in parent node" },
    { L"ChildNode", JSON::Object {
             { L"ChildA", JSON::Array { 1,2 } },
             { L"ChildB", 42 },
         } },
};
std::cout << "Check equality: " << std::boolalpha << (document == expected) << std::endl;
std::cout << "Serialized: " << document;

パーサーの完全な実装を参照してください (注: シリアライゼーションも含まれます): https://github.com/sehe/spirit-v2-json/tree/q17064905

于 2013-06-12T12:44:57.743 に答える