如何列出所有 minecraft 配置文件

How to list all minecraft profiles

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

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

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

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

但是当我发送网站转换 C# 它时 returns 这个:

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

Have you any way I can read the launcher_profiles.json file minecraft using Newtonsoft.Json.Linq?

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

将其放入 Json2CSharp 中以了解我的意思:

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

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

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

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

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"]);
            }
        }
    }
}

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

像这样定义您的 classes:

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; }
}

然后,您可以使用 JavaScriptSerializer or Json.Net 反序列化为 RootObject class。

这是一个使用 Json.Net 的 fiddle:https://dotnetfiddle.net/ZlEK63