unity3d 我在c#(Unity)中从json文件访问对象中的字符串时遇到了问题

mtb9vblg  于 2023-04-21  发布在  C#
关注(0)|答案(1)|浏览(84)

所以我的问题是,当我试图访问json类的内容时,它返回一个空字符串值。首先,我试图创建一个对话系统。我试图将行和关于行的信息保存在一个json文件中的字符串中。(角色是一个篝火,这也是它被称为fireDialogue的原因)正如你在下面的json文件中看到的一行对话的对象由三个字符串组成,一个字符串实际包含该行,一个字符串包含该对话显示的速度,一个字符串包含字体颜色。(我希望能够使行的特定部分显示得更快并具有更多的可能性,所以我才加了|,所以我可以。稍后再拆分它)。我现在要发送相关代码,也许你们中的任何人都可以发现导致错误的原因:
json文件:

{
    "dialogue": {
        "fireDialogue": [
            {
                "content": "Hello there",
                "letterDelay": "30",
                "fontColour": ""
            },
            {
                "content": "I talk |slow |and |fast",
                "letterDelay": "30|50|30|10",
                "fontColour": ""
            }
        ],
}

json类:

[System.Serializable]
public class DialogueData
{
    public Dialogue dialogue;
}

[System.Serializable]
public class Dialogue
{
    public List<DialogueContent> fireDialogue;
}

[System.Serializable]
public class DialogueContent
{
    public string content {get; set; }
    public string letterDelay {get; set; }
    public string fontColour {get; set; }
}

我尝试访问json的脚本:

public class CharacterInteraction : MonoBehaviour
{
    public DialogueData dialogueData;
    public TextAsset jsonFile;
    void Start()
    {

        jsonFile = Resources.Load<TextAsset>("dialogue");

        dialogueData = JsonUtility.FromJson<DialogueData>(jsonFile.text);

        fireDialogueOrder = 0; // should access the first index of the list

        //the following Debug.Log() returns an empty string for some reason
        Debug.Log(dialogueData.dialogue.fireDialogue[fireDialogueOrder].content);
    }
}

我已经检查了几个在线资源,并将我的json文件放入一个检查错误的网站,它没有发现任何错误。我还检查了json类是否正确,以及我在访问值的脚本中是否正确引用了它,但没有什么对我来说很明显。显然,我也进行了四次检查,如果文件名是正确的。而且Visual Studio Code和Unity都没有显示任何错误消息。结果就是错误的。
我问了比我更有编程经验的朋友,他们也没有任何想法,除了它必须与序列化有关。
我尝试删除json中包含三个字符串的对象,并直接将字符串值放入fireDialogue对象中,因此它将是字符串列表,而不是对象列表,这很好。问题似乎与我使用对象有关。
我希望我已经提供了足够的信息让你了解这个问题。我很感谢任何帮助!

dwbf0jvd

dwbf0jvd1#

由于您使用的是JsonUtility,因此必须从属性中删除get/set

[System.Serializable]
public class DialogueContent
{
    public string content ;
    public string letterDelay ;
    public string fontColour ;
}

但是我建议你找一个Unity的nuget包Newtonsoft.json并安装它。在这种情况下,你需要将get set添加到一些属性中;

using Newtonsoft.Json;

dialogueData = JsonConvert.DeserializeObject<DialogueData>(jsonFile.text);

public class DialogueData
{
    public Dialogue dialogue {get; set;}
}

public class Dialogue
{
    public List<DialogueContent> fireDialogue {get; set;}
}

相关问题