如何列出所有的Minecraft配置文件

时间:2016-02-29 20:36:47

标签: c# json minecraft

如何通过launcher_profiles.json文件列出所有的Minecraft配置文件?

我尝试使用网站json2csharp.com,但不幸的是,当它生成类准备好的代码时,他已经返回了所有的配置文件,就像它也是一个类一样。

例如: 我使用了这个简单的代码我的文件...

{
"profiles": {
  "1.7.10": {
     "name": "1.7.10",
     "lastVersionId": "1.7.10"
   }
  },
  "selectedProfile": "1.7.10"
}

但是当我发送网站转换C#时,它会返回:

public class __invalid_type__1710
{
   public string name { get; set; }
    public string lastVersionId { get; set; }
}

public class Profiles
{
    public __invalid_type__1710 __invalid_name__1.7.10 { get; set; }
}

public class RootObject
{
    public Profiles profiles { get; set; }
    public string selectedProfile { get; set; }
}

亲眼看看:Json2CSharp

  

您有什么方法可以使用Newtonsoft.Json.Linq阅读 launcher_profiles.json 文件。

3 个答案:

答案 0 :(得分:3)

虽然在许多情况下很有用,json2csharp.com并非万无一失。如您所见,它不处理密钥名称是动态的或无法转换为有效C#标识符的情况。在这些情况下,您需要手动调整生成的类。例如,您可以使用Dictionary<string, Profile>代替静态类来处理profiles对象的动态键。

像这样定义你的类:

public class RootObject
{
    public Dictionary<string, Profile> profiles { get; set; }
    public string selectedProfile { get; set; }
}

public class Profile
{
    public string name { get; set; }
    public string lastVersionId { get; set; }
}

然后,您可以使用JavaScriptSerializerJson.Net,无论您喜欢哪种方式,反序列化到RootObject课程。

这是使用Json.Net的小提琴:https://dotnetfiddle.net/ZlEK63

答案 1 :(得分:1)

所以问题可能是launcher_profiles.json不是真正的犹太洁食。

把它放到Json2CSharp中看看我的意思:

{
"profiles": [
  {
     "name": "1.7.10",
     "lastVersionId": "1.7.10"
   }
  ],
  "selectedProfile": "1.7.10"
}

这里的不同之处在于我重新定义了配置文件节点,以正确表示映射到C#中通用列表的集合(数组)。

您可能需要手动解析该文件,因为JSON.Net或其他选项将无法使用无效的json格式。

答案 2 :(得分:1)

我通常不使用Linq versions of the Json.Net library,但我想出了一个简单的例子,说明如何获取配置文件的所有名称(你不能序列化到给定的类中格式)。

class Program
{
    //Add another "profile" to show this works with more than one
    private static String json = "{ \"profiles\": { \"1.7.10\": { \"name\": \"1.7.10\", \"lastVersionId\": \"1.7.10\" }, \"1.7.11\": { \"name\": \"1.7.11\", \"lastVersionId\": \"1.7.11\" } }, \"selectedProfile\": \"1.7.10\" }";

    static void Main(string[] args)
    {
        //Parse to JObject
        var obj = Newtonsoft.Json.Linq.JObject.Parse(json);

        foreach (var profile in obj["profiles"])
        {
            foreach (var child in profile.Children())
            {
                Console.WriteLine(child["name"]);
            }
        }
    }
}