【问题标题】:Unity : Can't read the string from the JSON file [duplicate]Unity:无法从 JSON 文件中读取字符串 [重复]
【发布时间】:2017-04-03 07:16:52
【问题描述】:

我正在尝试从 json 文件中读取字符串并将其传递给我在 Unity 中的 UI 文本,我面临的问题是字符串始终为空,我不知道为什么,现在我找到了 JSON 文件路径并读取它,但是当我尝试访问字符串时它为空。我不确定如何阅读 json。我真的不明白这一切是如何运作的。我是 JSON 格式的新手,我正在尝试练习它。这是我的第一种方法。我正在使用 Unity Engine,我正在使用 Streaming Assets 读取 json 文件

从 Json 脚本中读取数据:

using UnityEngine;
using System.IO;


public class ReadFromJson : MonoBehaviour {

private string _filePath = "myText.json";

Data dh;

string str;
 void Start()
{



    LoadGameData();
}

public Data getCurrentRoundData()
{
    return dh;
}

private void LoadGameData()
{
    string filePath = Path.Combine(Application.streamingAssetsPath, _filePath);


    if (File.Exists(filePath))
    {

        string dataAsJSON = File.ReadAllText(filePath);
        DataHolder loadedData = JsonUtility.FromJson<DataHolder>(dataAsJSON);

        dh = loadedData.data;
        str = loadedData.data.TextToPass;
        Debug.Log("My Text is" + dh.TextToPass);

        Debug.Log("Path Exist");

    }


    else
    {
        Debug.LogError("CANNOT LOAD GAME DATA!!");
    }

}

}

将 json 数据应用到我的 UI 文本的管理器

    DataController = FindObjectOfType<ReadFromJson>();

    _data = DataController.getCurrentRoundData();


    myText.text = _data.TextToPass;

DataHolder.cs

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

[System.Serializable]

public class DataHolder {

public Data data;

}

Json 文本

{"DataHolder":

    {
        "TextToPass":"I'm A Horse"
    }

}

数据.cs

[System.Serializable]
public class Data {

public string TextToPass ;
}

我得到的是 TextToPass 为空

【问题讨论】:

  • 你能分享你的DataHolder模型吗?
  • 是检查更新问题
  • 您的问题缺少很多东西。您需要发布您正在阅读的 json 文件。 File.Exists 是否返回 true? TextToPass 是什么?您可以在 Unity here 中查看如何读取 json。看起来您想用 Json 保存 GameData。我为那个here做了一个助手类。
  • 数据模型怎么样?
  • File Exist 返回 true 是,而我的 json 只有一个 TextToPass,上面写着我是一匹马,我只是想阅读该文本并将其应用于我的 Ui 文本

标签: c# json unity3d


【解决方案1】:

模型有Data,JSON 有DataHolder。 JSON 库不假定“哦,有一个属性,他们一定是这个意思” - 它是按名称进行的,并且名称不匹配。

要么更改您的类型,要么更改 JSON。他们需要匹配。作为说明,表单的一种类型:

public class Foo {
    public int Bar {get;set;}
}

匹配 JSON 格式:

{ "Bar": 123 }

【讨论】:

  • 这是否适用于 Unity?我认为它们的属性存在问题。
  • 我真的.. 不明白.. 我没有完全看到我的问题。需要改什么类型
  • @Nanopl 您的根类型是 DataHolder;它只有一个 Data 属性。 json 指定了一个 DataHolder 属性 - 在 DataHolder 中不存在。 json 应该是“数据”,或者类型需要改变。你的 json 相当于 { "Foo": ... } 我的例子
  • @Nanopl 专业提示:在调试反序列化问题时,找到问题的最简单方法是忘记反序列化,而是序列化你有什么,然后比较输出。
  • 我将我的 json 文件更改为路径 DataHolder > Data > Text。但它仍然不起作用。这不是问题吗?
【解决方案2】:

我不确定,但这可能会解决您的问题。将您的模型更改为:

数据模型:

[System.Serializable]

public class Data {

public DataHolder dataHolder;

}

还有你的 DataHolder 模型:

[System.Serializable]

public class DataHolder  {

public string TextToPass;

}

希望对你有帮助!

【讨论】:

  • 不起作用,我更改了它并出现错误,然后我修复了它们,它基本上只是更改名称..
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-07-16
  • 2018-01-27
  • 1970-01-01
  • 2021-02-25
  • 2015-12-22
  • 1970-01-01
相关资源
最近更新 更多