由于这个问题使对象列表反序列化,所以我一直把头撞在墙上很久。
它可以很好地序列化,但是问题在以后需要加载时会出现。
我已经阅读了很多关于stackoverflow的问题,并尝试将实际列表放入自己的类中并反序列化,而不是反序列化列表。
public class Guild
{
[JsonProperty("id")] internal ulong Id { get; set; }
[JsonProperty("prefix")] internal string Prefix { get; set; }
[JsonProperty("tracked_games")] internal List<string> TrackedGames { get; set; }
[JsonProperty("liverole_id")] internal ulong LiveroleId { get; set; }
}
这是课程。
using (var sw = new StreamWriter("guilds.json"))
{
sw.Write(JsonConvert.SerializeObject(_guilds));
}
(_ guilds是公会的列表)
这是序列化。效果很好,看起来像这样:
[{"id":139677590393716737,"prefix":"--","tracked_games":["Factorio"],"liverole_id":0}]
我反序列化
_guilds = JsonConvert.DeserializeObject<List<Guild>>("guilds.json");
尝试反序列化时出现的错误是
Newtonsoft.Json.JsonReaderException: Unexpected character encountered while parsing value: g. Path '', line 0, position 0.
at Newtonsoft.Json.JsonTextReader.ParseValue() in /_/Src/Newtonsoft.Json/JsonTextReader.cs:line 1772
at Newtonsoft.Json.JsonReader.ReadForType(JsonContract contract, Boolean hasConverter) in /_/Src/Newtonsoft.Json/JsonReader.cs:line 1195
at Newtonsoft.Json.Serialization.JsonSerializerInternalReader.Deserialize(JsonReader reader, Type objectType, Boolean checkAdditionalContent) in /_/Src/Newtonsoft.Json/Serialization/JsonSerializerInternalReader.cs:line 149
at Newtonsoft.Json.JsonSerializer.DeserializeInternal(JsonReader reader, Type objectType) in /_/Src/Newtonsoft.Json/JsonSerializer.cs:line 907
at Newtonsoft.Json.JsonConvert.DeserializeObject(String value, Type type, JsonSerializerSettings settings) in /_/Src/Newtonsoft.Json/JsonConvert.cs:line 828
at Newtonsoft.Json.JsonConvert.DeserializeObject[T](String value, JsonSerializerSettings settings) in /_/Src/Newtonsoft.Json/JsonConvert.cs:line 786
at Squid.Squid.LoadGuilds() in D:\Repos\Projects\Squid\Squid\Squid.cs:line 93
任何帮助将不胜感激。我在这个问题上花了很长时间,但我真的不明白为什么会这样。我觉得我在做与反序列化列表一样的所有其他答案。
答案 0 :(得分:1)
@styx指出,您需要使用StreamReader读取文件。您可以检查以下代码:
using (StreamReader reader = new StreamReader("file.txt"))
{
line = reader.ReadToEnd();
}
答案 1 :(得分:1)
当尝试反序列化json时,JsonConvert.DeserializeObject不能作为StreamReader起作用,您需要先读取文件,然后反序列化文件内容。
using (StreamReader rdr = new StreamReader("guilds.json"))
{
guilds = JsonConvert.DeserializeObject<MainProp>(rdr.ReadToEnd());
}
这应该对您有用。
答案 2 :(得分:1)
将文件读入字符串并将JSON反序列化为一种类型
_guilds = JsonConvert.DeserializeObject<List<Guild>>(File.ReadAllText(("guilds.json"));
或直接从文件中反序列化JSON
using (StreamReader file = File.OpenText("guilds.json")) // or new StreamReader(..)
{
JsonSerializer serializer = new JsonSerializer();
_guilds = (List<Guild>)serializer.Deserialize(file, typeof(List<Guild>));
}