【问题标题】:How to convert JSON/Dynamic Structure to Map in Haxe?如何在 Haxe 中将 JSON/动态结构转换为地图?
【发布时间】:2018-08-07 01:42:59
【问题描述】:

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

我有一个 JSON 文件,我想将其转换为嵌套地图(字典)。我曾尝试使用 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"
    ]
  }
}

【问题讨论】:

    标签: json dictionary haxe


    【解决方案1】:

    另一种选择是使用json2object 库,natively supports Map<String, T>:

    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,这通常被认为是不好的做法。

    【讨论】:

      【解决方案2】:

      您可以创建地图并通过 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>;
      }
      

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

      【讨论】:

        【解决方案3】:

        看看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);
                }  
            }
        }
        

        【讨论】:

        • 通常最好在您的答案中包含代码 sn-p(或其简化版本),因为将来外部链接可能会失效。
        • 但是……这段代码并没有真正解析 JSON 文件。 Json.parse(...) 返回的对象的任何解决方案?
        • 我喜欢这个答案,因为它使用标准 Haxe 库来完成与地图基本相同的事情。从这个意义上说,它是最好的答案,因为它并没有准确地给出所要求的东西——它识别出真正的需求并提供了一个优雅的解决方案。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2021-10-18
        • 1970-01-01
        • 2019-09-22
        • 1970-01-01
        • 1970-01-01
        • 2021-08-07
        • 2015-02-05
        相关资源
        最近更新 更多