首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何使用fastJSON与JSON数组

如何使用fastJSON与JSON数组
EN

Stack Overflow用户
提问于 2016-10-16 16:02:41
回答 1查看 1.3K关注 0票数 1

我正在使用fastJSON从我创建的JSON文件中读取数据( JSON文件中包含一个游戏级别的数据,用于Unity的项目,但这并不重要)。这是JSON内容:

代码语言:javascript
复制
{"1": {
    "background": "background1.png",
    "description": "A description of this level",
    "enemies": 
              [{"name": "enemy1", "number": "5"},
               {"name": "enemy2", "number": "2"}]},
 "2": {
    "background": "background1.png",
    "description": "A description of this level",
    "enemies": 
              [{"name": "enemy1", "number": "8"},
               {"name": "enemy2", "number": "3"}]},
"3": {
    "background": "background2.png",
    "description": "A description of this level",
    "enemies": 
              [{"name": "enemy2", "number": "5"},
               {"name": "enemy3", "number": "3"},
               {"name": "enemy4", "number": "1"}]}
}

这是我的密码:

代码语言:javascript
复制
using UnityEngine;
using System.Collections.Generic;
using fastJSON;

public class LevelManager : MonoBehaviour {

    private Dictionary<string, object> currentLevelData;

    public TextAsset levelJSON;
    public int currentLevel;

    // Use this for initialization
    void Start () {

        currentLevelData = LevelElements (currentLevel);
        if (currentLevelData != null) {
            Debug.Log (currentLevelData["background"]);
            Debug.Log (currentLevelData["description"]);
            /* How iterate the "enemies" array */
        } else {
            Debug.Log ("Could not find level '" + currentLevel + "' data");
        }
    }

    Dictionary<string, object> LevelElements (int level) {
        string jsonText = levelJSON.ToString();
        Dictionary<string, object> dictionary = fastJSON.JSON.Parse(jsonText) as Dictionary<string, object>;

        Dictionary<string, object> levelData = null;
        if (dictionary.ContainsKey (level.ToString ())) {
            levelData = dictionary [level.ToString ()] as Dictionary<string, object>;
        }

        return levelData;
    }
}

我不知道如何用“敌人”的名字来迭代数组数据。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-10-16 19:26:04

按照当前的代码编写方式,您可以像这样迭代敌人:

代码语言:javascript
复制
foreach (Dictionary<string, object> enemy in (List<object>)currentLevelData["enemies"])
{
    Debug.Log(enemy["name"]);
    Debug.Log(enemy["number"]);
}

但是,我建议创建一些强类型的类来接收数据:

代码语言:javascript
复制
public class Level
{
    public string background { get; set; }
    public string description { get; set; }
    public List<Enemy> enemies { get; set; }
}

public class Enemy
{
    public string name { get; set; }
    public string number { get; set; }
}

理想情况下,这将允许您像这样反序列化:

代码语言:javascript
复制
Dictionary<string, Level> dictionary = 
                          fastJSON.JSON.ToObject<Dictionary<string, Level>>(jsonText);

不幸的是,fastJSON似乎无法处理这个问题(我尝试过了,得到了一个异常)。但是,如果切换到一个更健壮的库(如Json.Net ),它可以正常工作:

代码语言:javascript
复制
Dictionary<string, Level> dictionary = 
                        JsonConvert.DeserializeObject<Dictionary<string, Level>>(jsonText);

这将使您可以重写代码,以便更容易地处理数据:

代码语言:javascript
复制
public class LevelManager : MonoBehaviour
{
    private Level currentLevelData;

    public string levelJSON;
    public int currentLevel;

    // Use this for initialization
    void Start()
    {
        currentLevelData = LevelElements(currentLevel);
        if (currentLevelData != null)
        {
            Debug.Log(currentLevelData.background);
            Debug.Log(currentLevelData.description);

            foreach (Enemy enemy in currentLevelData.enemies)
            {
                Debug.Log(enemy.name);
                Debug.Log(enemy.number);
            }
        }
        else
        {
            Debug.Log("Could not find level '" + currentLevel + "' data");
        }
    }

    Level LevelElements(int level)
    {
        string jsonText = levelJSON.ToString();
        Dictionary<string, Level> dictionary = 
                JsonConvert.DeserializeObject<Dictionary<string, Level>>(jsonText);

        Level levelData = null;
        if (dictionary.ContainsKey(level.ToString()))
        {
            levelData = dictionary[level.ToString()];
        }

        return levelData;
    }
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/40072313

复制
相关文章

相似问题

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