栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

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

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

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

从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
班级进入字典。

演示在这里和这里摆弄。



转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/383241.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号