C#JSON.NET – 反序列化使用不寻常的数据结构的响应

我有一些麻烦找出一个干净(尽可能)的方式来反序列化一些特定格式的JSON数据。 我想反序列化数据到强types的数据对象类,非常灵活的具体细节。 以下是数据的例子:

{ "timestamp": 1473730993, "total_players": 945, "max_score": 8961474, "players": { "Player1Username": [ 121, "somestring", 679900, 5, 4497, "anotherString", "thirdString", "fourthString", 123, 22, "YetAnotherString"], "Player2Username": [ 886, "stillAstring", 1677, 1, 9876, "alwaysAstring", "thirdString", "fourthString", 876, 77, "string"] } } 

我不确定的具体部分是:

  1. 球员的收集会被视为字典吗? 用户名可以作为键,但是这个值会把我扔掉,因为它是一个string和整数值的混合集合。
  2. 玩家完全由未命名的值组成。 我几乎一直使用名为属性和值的JSON数据(例如,时间戳,total_players等在顶部)

说我有这样的顶级课程:

 public class ScoreboardResults { public int timestamp { get; set; } public int total_players { get; set; } public int max_score { get; set; } public List<Player> players { get; set; } } 

Player对象看起来是什么样子,它基本上是一个键/值,用户名作为键,值是一个混合整数和string的集合? 每个玩家元素的数据总是处于相同的顺序,所以我知道集合中的第一个值是他们的UniqueID,第二个值是玩家描述等等。我希望玩家类是这样的:

 public class Player { public string Username { get; set; } public int UniqueID { get; set; } public string PlayerDescription { get; set; } .... .... .... Following this pattern for all of the values in each player element .... .... } 

我相信这是使用JSON.NET的一个非常简单的事情,这就是为什么我想避免任何关于如何完成这个任务的想法。 我想到的将会是不雅观的,在序列化过程中可能会出现某种程度的错误。

编辑

以下是使用snow_FFFFFFbuild议的将过去作为JSON类生成的类:

 public class Rootobject { public int timestamp { get; set; } public int total_players { get; set; } public int max_score { get; set; } public Players players { get; set; } } public class Players { public object[] Player1Username { get; set; } public object[] Player2Username { get; set; } } 

我不清楚的是,如何反序列化“players”元素中的JSON数据作为List,Player1Username是Player对象上的简单string属性。 至于混合string和整数的集合,我相信我可以将它们放入Player对象的单个属性中而没有问题。

从Visual Basic .NET中反序列化JSON的转换器应该做你所需要的,适当地从VB.NET转换为c#:

 public class ObjectToArrayConverter<T> : JsonConverter { public override bool CanConvert(Type objectType) { return typeof(T) == objectType; } static bool ShouldSkip(JsonProperty property) { return property.Ignored || !property.Readable || !property.Writable; } public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer) { var type = value.GetType(); var contract = serializer.ContractResolver.ResolveContract(type) as JsonObjectContract; if (contract == null) throw new JsonSerializationException("invalid type " + type.FullName); var list = contract.Properties.Where(p => !ShouldSkip(p)).Select(p => p.ValueProvider.GetValue(value)); serializer.Serialize(writer, list); } public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer) { if (reader.TokenType == JsonToken.Null) return null; var token = JToken.Load(reader); if (token.Type != JTokenType.Array) throw new JsonSerializationException("token was not an array"); var contract = serializer.ContractResolver.ResolveContract(objectType) as JsonObjectContract; if (contract == null) throw new JsonSerializationException("invalid type " + objectType.FullName); var value = existingValue ?? contract.DefaultCreator(); foreach (var pair in contract.Properties.Where(p => !ShouldSkip(p)).Zip(token, (p, v) => new { Value = v, Property = p })) { var propertyValue = pair.Value.ToObject(pair.Property.PropertyType, serializer); pair.Property.ValueProvider.SetValue(value, propertyValue); } return value; } } 

接下来,将转换器添加到您的Player类,并使用JsonPropertyAttribute.Order指示每个属性的顺序:

 [JsonConverter(typeof(ObjectToArrayConverter<Player>))] public class Player { [JsonProperty(Order = 1)] public int UniqueID { get; set; } [JsonProperty(Order = 2)] public string PlayerDescription { get; set; } // Other fields as required. } 

最后,声明你的根对象如下:

 public class ScoreboardResults { public int timestamp { get; set; } public int total_players { get; set; } public int max_score { get; set; } public Dictionary<string, Player> players { get; set; } } 

请注意,我已将UsernamePlayer类中移出并作为关键字移入字典中。

开始的一个好方法是让Visual Studio根据JSON生成你的类。 打开一个空白的类文件,然后去编辑 – >粘贴特殊 – >粘贴JSON作为CLASSES。

这将生成一个具有必要的类的文件来序列化/反序列化您的JSON。

尝试这个

创build一个类如下所示

注意:您可以在Visual Studio中使用select性粘贴选项来生成与JSON相关的所有类

编辑 – >select性粘贴 – >将Json粘贴为类

它将创build所有与JSON相关的类

注意:参考这个我已经回答类似这样的..