Search code examples
c#unity-game-engineoculus

how to Load json for windows build unity


I have tried alot of solution but no one is working in my case, my question is simple but i cant find any answer specially for windows build. I have tried to load json form persistent , streaming and resource all are working good in android but no any solution work for windows build. here is my code please help me.

public GameData gameData;
    private void LoadGameData()
    {
        string path = "ItemsData";
        TextAsset targetFile = Resources.Load<TextAsset>(path);
        string json = targetFile.text;
        gameData = ResourceHelper.DecodeObject<GameData>(json);
        //  gameData = JsonUtility.FromJson<GameData>(json);
        print(gameData.Items.Count);
}

here is my data class

[Serializable]
public class GameData
{
    [SerializeField]
    public List<Item> Items;


    public GameData()
    {
        Items = new List<Item>();
    }
}

public class Item
{
    public string Id;
    public string[] TexturesArray;

    public bool Active;

    public Item()
    {
    }
    public Item(string _id, string[] _textureArray ,  bool _active = true)
    {
        Id = _id;
        TexturesArray = _textureArray;
        Active = _active;
    }
}

Solution

  • In order to be (de)serialized Item should be [Serializable]

    using System;
    
    ...
    
    [Serializable]
    public class Item
    {
        ...
    }
    

    Then you could simply use Unity's built-in JsonUtility.FromJson:

    public GameData gameData;
    private void LoadGameData()
    {
        string path = "ItemsData";
        TextAsset targetFile = Resources.Load<TextAsset>(path);
        string json = targetFile.text;
        gameData = JsonUtility.FromJson<GameData>(json);
        print(gameData.Items.Count);
    }
    

    For loading something from e.g. persistentDataPath I always use something like

    var path = Path.Combine(Application.persistentDataPath, "FileName.txt")
    using (var fs = File.Open(path, FileMode.Open, FileAccess.Read, FileShare.Read))
    {
        using (var sr = new StreamReader(fs))
        {
            var json = sr.ReadToEnd();
    
            ...
        }
    }
    

    For development I actually place my file into StreamingAssets (streamingAssetsPath) while running the code in the Unity Editor.

    Then on runtime I read from persistentFilePath. If the file is not there I first copy it from the streamingassetsPath the first time.

    Here I wrote more about this approach