我是一个编程新手,通常使用基于Haxe (Stencyl)的拖放编辑器作为业余爱好。
我有一个JSON文件,我想将其转换为嵌套的map (字典)。我尝试过使用JSON解析函数,但它返回一个匿名(动态)结构。
如何将JSON文件转换为映射或将匿名结构转换为映射?
JSON示例:
{
"apple": {
"value": 10,
"health": 15,
"tags": [
"fruit",
"fiber",
"sweet"
]
},
"lemon": {
"value": 5,
"health": 10,
"tags": [
"fruit",
"citrus",
"sour"
]
},
"ham": {
"value": 50,
"health": 50,
"tags": [
"salty",
"meat"
]
}
}发布于 2018-08-07 17:23:50
另一种选择是使用json2object库,natively supports Map
import sys.io.File;
import json2object.JsonParser;
class Main {
public static function main() {
var parser = new JsonParser<Data>();
var source = File.getContent("data.json");
var data = parser.fromJson(source, "data.json");
trace(data["apple"].value); // 10
}
}
typedef Data = Map<String, {
var value:Int;
var health:Int;
var tags:Array<String>;
}>这种方法避免了反射和Dynamic,这通常被认为是不好的做法。
发布于 2018-08-07 15:47:05
您可以创建Map并通过Reflect api填充它:
var parse = haxe.Json.parse(s);
var map:Map<String, StructData> = new Map();
for(field in Reflect.fields(parse))
{
map.set(field, Reflect.field(parse, field));
}
typedef StructData = {
var value:Int;
var health:Int;
var tags:Array<String>;
}发布于 2018-08-07 15:46:55
看一看DynamicAccess抽象的here。
根据您的示例,我做了一个简单的示例here
import haxe.DynamicAccess;
typedef Food = {
var value:Int;
var health:Int;
var tags:Array<String>;
}
class Test {
static function main() {
var json = {
"apple": {
"value": 10,
"health": 15,
"tags": [
"fruit",
"fiber",
"sweet"
]
},
"lemon": {
"value": 5,
"health": 10,
"tags": [
"fruit",
"citrus",
"sour"
]
},
"ham": {
"value": 50,
"health": 50,
"tags": [
"salty",
"meat"
]
}
};
var foodMap:DynamicAccess<Food> = json;
// Get a single entry
var apple = foodMap.get("apple");
trace(apple.tags.join(", "));
// Loop through names
for (foodName in foodMap.keys()) {
trace(foodName);
trace(foodMap.get(foodName).value);
}
}
}https://stackoverflow.com/questions/51717684
复制相似问题