我想使用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);
}发布于 2021-04-10 23:27:23
将您的逻辑封装到一个常规的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-11 00:36:48
多亏了弗拉基米尔,他指定的技巧在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);
}https://stackoverflow.com/questions/67035802
复制相似问题