在.net

时间:2018-12-06 09:06:23

标签: c# .net json json.net

由于这个问题使对象列表反序列化,所以我一直把头撞在墙上很久。

它可以很好地序列化,但是问题在以后需要加载时会出现。

我已经阅读了很多关于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

任何帮助将不胜感激。我在这个问题上花了很长时间,但我真的不明白为什么会这样。我觉得我在做与反序列化列表一样的所有其他答案。

3 个答案:

答案 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>));
}