首页 > 解决方案 > 如何反序列化这个特定的 json 字符串?

问题描述

我正在尝试使用 Newtonsoft Json 反序列化以下 json 字符串。我能够成功获取字符串,但是当我尝试使用时JsonConvert.DeserializeObject<ServerList>(response, settings);,尝试捕获失败。

[
{"endpoint":"127.0.0.1","id":6,"identifiers":["steam:","license:","xbl:","live:","discord:"],"name":"Blurr","ping":160},
{"endpoint":"127.0.0.1","id":7,"identifiers":["steam:","license:","xbl:","live:","discord:"],"name":"Knight","ping":120}
]

我相信我的问题是因为玩家阵列未命名。

我已经为 Users var 尝试过 [JsonProperty("")] 和 [JsonProperty],我也尝试过使用 List 和 Array 而不是 IList。

这是对象。这可能是完全错误的,我尝试了很多方法。

    public class ServerList
    {
        // I have tried many ways of doing this array/list. This is just the latest way I tried.
        [JsonProperty]
        public static IList<Player> Users { get; set; }
    }

    public class Player
    {
        [JsonProperty("endpoint")]
        public static string Endpoint { get; set; }

        [JsonProperty("id")]
        public static string ServerId { get; set; }

        [JsonProperty("identifiers")]
        public static IList<string> Identifiers { get; set; }

        [JsonProperty("name")]
        public static string Name { get; set; }

        [JsonProperty("ping")]
        public static int Ping { get; set; }
    }

我期望得到一个“ServerList”对象,其中包含连接到服务器的所有玩家的列表。

问你需要的任何问题,我不经常使用这种格式的 json。先感谢您!

错误:从 JsonReader 读取 JObject 时出错。当前 JsonReader 项不是对象:StartArray。路径'',第 1 行,位置 1。

标签: c#.netjsonjson.netdeserialization

解决方案


最简单的方法:你的 json 是一个数组,所以反序列化为一个数组:

JsonConvert.DeserializeObject<Player[]>(response,settings);

如评论中所述, 上的属性Player不应该是静态的。

如果您坚持使用与您发布的内容类似的对象结构,即具有Users属性的对象,即使它不存在于 JSON 中,也可以通过实现自定义 JSON 转换器来实现。这里有一篇带有示例的文章:https ://www.jerriepelser.com/blog/custom-converters-in-json-net-case-study-1/

然而; 我建议坚持使用 json 中存在的类型,也许稍后再构造对程序中的模型有意义的对象。这样,您反序列化的内容对您获得的 json 是真实的,但不会牺牲您想要的模型:

var players = JsonConvert.DeserializeObject<Player[]>(response,settings);
var serverList = new ServerList {Users = players};

推荐阅读