如何将包含具有固定模式的值数组的对象反序列化为强类型数据类?

如何将包含具有固定模式的值数组的对象反序列化为强类型数据类?,第1张

如何将包含具有固定模式的值数组对象反序列化为强类型数据类?

从Visual Basic
.NET中的反序列化JSON进行
转换的转换器应该执行您所需的 *** 作,并将其适当地从VB.NET转换为c#:

public class ObjectToArrayConverter<T> : JsonConverter{    public override bool CanConvert(Type objectType)    {        return typeof(T) == objectType;    }    public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)    {        var objectType = value.GetType();        var contract = serializer.ContractResolver.ResolveContract(objectType) as JsonObjectContract;        if (contract == null) throw new JsonSerializationException(string.Format("invalid type {0}.", objectType.FullName));        writer.WriteStartArray();        foreach (var property in SerializableProperties(contract))        { var propertyValue = property.ValueProvider.GetValue(value); if (property.Converter != null && property.Converter.CanWrite)     property.Converter.WriteJson(writer, propertyValue, serializer); else     serializer.Serialize(writer, propertyValue);        }        writer.WriteEndArray();    }    public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)    {        var contract = serializer.ContractResolver.ResolveContract(objectType) as JsonObjectContract;        if (contract == null) throw new JsonSerializationException(string.Format("invalid type {0}.", objectType.FullName));        if (reader.MoveToContentAndAssert().TokenType == JsonToken.Null) return null;        if (reader.TokenType != JsonToken.StartArray) throw new JsonSerializationException(string.Format("token {0} was not JsonToken.StartArray", reader.TokenType));        // Not implemented: JsonObjectContract.CreatorParameters, serialization callbacks,         existingValue = existingValue ?? contract.DefaultCreator();        using (var enumerator = SerializableProperties(contract).GetEnumerator())        { while (true) {     switch (reader.ReadToContentAndAssert().TokenType)     {         case JsonToken.EndArray:  return existingValue;         default:  if (!enumerator.MoveNext())  {      reader.Skip();      break;  }  var property = enumerator.Current;  object propertyValue;  // TODO:  // https://www.newtonsoft.com/json/help/html/Properties_T_Newtonsoft_Json_Serialization_JsonProperty.htm  // JsonProperty.ItemConverter, ItemIsReference, ItemReferenceLoopHandling, ItemTypeNameHandling, DefaultValue, DefaultValueHandling, ReferenceLoopHandling, Required, TypeNameHandling, ...  if (property.Converter != null && property.Converter.CanRead)      propertyValue = property.Converter.ReadJson(reader, property.PropertyType, property.ValueProvider.GetValue(existingValue), serializer);  else      propertyValue = serializer.Deserialize(reader, property.PropertyType);  property.ValueProvider.SetValue(existingValue, propertyValue);  break;     } }        }    }    static IEnumerable<JsonProperty> SerializableProperties(JsonObjectContract contract)    {        return contract.Properties.Where(p => !p.Ignored && p.Readable && p.Writable);    }}public static partial class JsonExtensions{    public static JsonReader ReadToContentAndAssert(this JsonReader reader)    {        return reader.ReadAndAssert().MoveToContentAndAssert();    }    public static JsonReader MoveToContentAndAssert(this JsonReader reader)    {        if (reader == null) throw new ArgumentNullException();        if (reader.TokenType == JsonToken.None)       // Skip past beginning of stream. reader.ReadAndAssert();        while (reader.TokenType == JsonToken.Comment) // Skip past comments. reader.ReadAndAssert();        return reader;    }    public static JsonReader ReadAndAssert(this JsonReader reader)    {        if (reader == null) throw new ArgumentNullException();        if (!reader.Read()) throw new JsonReaderException("Unexpected end of JSON stream.");        return reader;    }}

接下来,将转换器添加到您的

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; }}

请注意,作为键,我已经

Username
离开
Player
班级进入字典。

演示在这里和这里摆弄。



欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zaji/4943497.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-11-13
下一篇 2022-11-13

发表评论

登录后才能评论

评论列表(0条)

保存