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

问题描述 投票:4回答:3

我是一个非常新的编码,通常使用基于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
3个回答
4
投票

另一个选择是使用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,这通常被认为是不好的做法。


3
投票

你可以创建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>;
}

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


1
投票

看看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);
        }  
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.