【问题标题】:json.net, how do I deserialize json object from relative path or actual json objectjson.net,如何从相对路径或实际 json 对象反序列化 json 对象
【发布时间】:2019-03-10 00:37:41
【问题描述】:

谁能告诉我如何使用另一个 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,而是如何以接受字符串路径作为对象的方式对其进行反序列化。
  • File.ReadAllText 可能是您所追求的。
  • 这可行,但我更倾向于自定义反序列化器。该方法需要我搜索它

标签: c# json deserialization


【解决方案1】:

首先你需要为这个 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));

【讨论】:

  • 我已经知道这一点,但如果关键“LevelConfig”是另一个 json 文件的路径,我认为这不起作用
  • 你的 Json 对象嵌套在对象内部。你需要在另一个类中创建一个类。
  • 我做了它叫做 JLevel
  • 我已经修改了答案
  • 哦,好的,我明白您所说的“类的名称应该与 JSON 中的对象名称相同”的意思。但我仍然不明白“JsonConvert.DeserializeObject(JsonConvert.SerializeObject(Json));”解决了我的问题。
【解决方案2】:
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 的实现

【讨论】:

猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-01-14
  • 2014-08-22
  • 2011-05-30
  • 2015-11-10
  • 2013-08-14
相关资源
最近更新 更多