簡體   English   中英

json.net,如何從相對路徑或實際 json 對象反序列化 json 對象

[英]json.net, how do I deserialize json object from relative path or actual json object

有人可以告訴我如何使用另一個 json 文件的路徑或 json 對象來反序列化 json 對象嗎?

我正在嘗試制作一個完全由配置文件構成的游戲。

基本上我會選擇這兩個......

{
    "LevelConfig" : {
        "SkillGain" : 0.01,
        "MagicGain" : 0.01,
        "XpScale"   : 50.0,
        "HpScale"   : 0.01,
        "MpScale"   : 0.01
    }
}

or 

{
    "LevelConfig" : "../Level.level" (only returns json object if file exists else it tries to return string)
}

並將它們轉換成這些

public class JLevel
{
    public float SkillGain { get; set; }
    public float MagicGain { get; set; }
    public float XpScale   { get; set; }
    public float HpScale   { get; set; }
    public float MpScale   { get; set; }
}

public class JEntity
{
        public string Name { get; set; }
        public int    Hp   { get; set; }
        public int    Mp   { get; set; }
        public int    Xp   { get; set; }

        public JLevel   LevelConfig   { get; set; }
        public JColor   ColorConfig   { get; set; }
        public JPhysics PhysicsConfig { get; set; }
}

class Entity
{
        public Entity Load(string filename)
        {
                return ???;
        }
        public void Save(string filename)
        {
                ???;
        }
}

現在我知道我可以只使用JsonConvert.DeserializeObject()但這不會檢查 json 路徑。

首先你需要為這個 Json 對象創建一個類

類的名稱應與JSON中的對象名稱相同

{
    "LevelConfig" : {
        "SkillGain" : 0.01,
        "MagicGain" : 0.01,
        "XpScale"   : 50.0,
        "HpScale"   : 0.01,
        "MpScale"   : 0.01
    }
}



public class LevelConfig
    {
        public double SkillGain { get; set; }
        public double MagicGain { get; set; }
        public double XpScale { get; set; }
        public double HpScale { get; set; }
        public double MpScale { get; set; }
    }

    public class Example
    {
        public LevelConfig LevelConfig { get; set; }
    }

那么你需要使用Newtonsoft對其進行脫鹽處理

JsonConvert.DeserializeObject<Example>(Json);

Json 應該是一個字符串。 如果它是一個對象,你需要在

JsonConvert.DeserializeObject<Example>(JsonConvert.SerializeObject(Json));
class Program
{
    public static void Main()
    {
        var str = "{ LevelConfig : \"level.json\"}";
        var levelConfigs = JsonConvert.DeserializeObject<LevelConfigs>(str);
        var fileTxt = GetFileText(levelConfigs.LevelConfig);
        JLevel level = JsonConvert.DeserializeObject<JLevel>(fileTxt);
        Console.WriteLine(level.HpScale);
        Console.ReadLine();

    }

    private static string GetFileText(string jsonFile)
    {
        return File.ReadAllText(jsonFile);
    }
}

public class LevelConfigs
{
    public string LevelConfig { get; set; }
}

public class JLevel
{
    public float SkillGain { get; set; }
    public float MagicGain { get; set; }
    public float XpScale { get; set; }
    public float HpScale { get; set; }
    public float MpScale { get; set; }
}

public class JEntity
{
    public string Name { get; set; }
    public int Hp { get; set; }
    public int Mp { get; set; }
    public int Xp { get; set; }

    public JLevel LevelConfig { get; set; }

}

您可以根據需要更改 GetFileText 的實現

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM