1

我想使用 CTFE 迭代 JSON。我已经尝试过 std.json 和 vibe.data.json,但没有运气。我不确定我错过了什么。

import std.stdio;
import std.json;
import std.array;
import vibe.data.json;

void main()
{
    enum string config = `{ "ModelNames": [ "Bank", "Biller", "Aggregator" ] }`;
    const auto c1 = parseJSON(config);
    immutable auto c2 = parseJsonString(config);
    
    foreach (key; c1["ModelNames"].array)
        writeln(key.get!string);

    foreach (key; c2["ModelNames"])
        writeln(key.get!string);

    // static foreach (key; c1["ModelNames"].array)
    //  pragma(msg, key.get!string);

    // static foreach (key; c2["ModelNames"])
    //  pragma(msg, key.get!string);
}
4

2 回答 2

5

将您的逻辑包装到常规 D 函数中,然后让编译器在编译时对其进行评估,方法是调用它是一个在编译时必须知道结果的上下文,例如在 中使用结果enum

import std.algorithm.iteration;
import std.stdio;
import std.json;
import std.array;

void main()
{
    enum string config = `{ "ModelNames": [ "Bank", "Biller", "Aggregator" ] }`;

    static string[] getModelNames(string json)
    {
        auto c1 = parseJSON(json);
        return c1["ModelNames"].array.map!(item => item.str).array;
    }

    enum string[] modelNames = getModelNames(config);
    pragma(msg, modelNames);
}
于 2021-04-10T15:27:23.193 回答
0

感谢 Vladimir,他指定的技巧对 std.json 和 vibe.data.json 都适用。

import std.algorithm.iteration;
import std.stdio;
import std.json;
import std.array;
import vibe.data.json;

void main()
{
    enum string config = `{ "ModelNames": [ "Bank", "Biller", "Aggregator" ] }`;
    immutable auto c1 = parseJSON(config);
    immutable auto c2 = parseJsonString(config);
    
    static foreach (key; c1["ModelNames"].array.map!(item => item).array)
        pragma(msg, key.get!string);

    static foreach (key; c2["ModelNames"].array.map!(item => item).array)
        pragma(msg, key.get!string);
}
于 2021-04-10T16:36:47.827 回答