如何通过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 文件。
答案 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; }
}
然后,您可以使用JavaScriptSerializer
或Json.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"]);
}
}
}
}