首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何将JSON/动态结构转换为Haxe中的Map?

如何将JSON/动态结构转换为Haxe中的Map?
EN

Stack Overflow用户
提问于 2018-08-07 09:43:00
回答 3查看 1K关注 0票数 5

我是一个编程新手,通常使用基于Haxe (Stencyl)的拖放编辑器作为业余爱好。

我有一个JSON文件,我想将其转换为嵌套的map (字典)。我尝试过使用JSON解析函数,但它返回一个匿名(动态)结构。

如何将JSON文件转换为映射或将匿名结构转换为映射?

JSON示例:

代码语言:javascript
复制
{
  "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"
    ]
  }
}
EN

回答 3

Stack Overflow用户

发布于 2018-08-07 17:23:50

另一种选择是使用json2object库,natively supports Map

代码语言:javascript
复制
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,这通常被认为是不好的做法。

票数 5
EN

Stack Overflow用户

发布于 2018-08-07 15:47:05

您可以创建Map并通过Reflect api填充它:

代码语言:javascript
复制
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>;
}

https://try.haxe.org/#DFa77

票数 3
EN

Stack Overflow用户

发布于 2018-08-07 15:46:55

看一看DynamicAccess抽象的here

根据您的示例,我做了一个简单的示例here

代码语言:javascript
复制
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);
        }  
    }
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/51717684

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档