首页 / C# / c# – 将名称/值对反序列化为对象
c# – 将名称/值对反序列化为对象
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了c# – 将名称/值对反序列化为对象,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含2323字,纯文字阅读大概需要4分钟。
内容图文
![c# – 将名称/值对反序列化为对象](/upload/InfoBanner/zyjiaocheng/797/c1d85e37724042a2940334eb2a684279.jpg)
我有一组名称/值对,用名称和值定义它们就像一个键/值对象,即
[{"Name":"ActivityId","DataType":1,"Value":"a7868f8c-07ac-488d-a414-714527c2e76f"},
{"Name":"Address1","DataType":2,"Value":"123 Main St"}]
如果我有一个像这样的对象:
class Request
{
public Guid ActivityId { get; set; }
public string Address1 {get; set; }
}
如何将此反序列化到上面的类?
我应该考虑定制转换器吗? Json.NET有内置的东西吗?有没有办法用我缺少的属性装饰属性?定制序列化会更容易吗?
我试图避免从Dictionary中提取每个属性的数据,这将是简单的路径,但是需要我对每个自定义实现执行此操作.我更喜欢在使用Json.NET(或.NET框架中的某些东西)的单个方法中在基类中执行此操作.
我搜索了很多,大多数例子是实名/值对,没有前缀名称和值,即
[{"ActivityId":"a7868f8c-07ac-488d-a414-714527c2e76f"}]
有任何想法吗?
解决方法:
这可以通过下面的自定义JsonConverter以简单的方式完成.转换器首先将名称 – 值对数组转换为具有镜像对的属性的JObject,然后使用序列化程序的内置Populate方法从JObject填充目标对象.
class NameValueConverter : JsonConverter
{
public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
{
// Load the array of name-value pairs and transform into a JObject.
// We are assuming all the names will be distinct.
JObject obj = new JObject(
JArray.Load(reader)
.Children<JObject>()
.Select(jo => new JProperty((string)jo["Name"], jo["Value"]))
);
// Instantiate the target object and populate it from the JObject.
object result = Activator.CreateInstance(objectType);
serializer.Populate(obj.CreateReader(), result);
return result;
}
public override bool CanWrite
{
get { return false; }
}
public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
{
// WriteJson is not called when CanWrite returns false
throw new NotImplementedException();
}
public override bool CanConvert(Type objectType)
{
// We only want this converter to handle classes that are expressly
// marked with a [JsonConverter] attribute, so return false here.
// (CanConvert is not called when [JsonConverter] attribute is used.)
return false;
}
}
要使用转换器,只需将[JsonConverter]属性添加到目标类:
[JsonConverter(typeof(NameValueConverter))]
class Request
{
public Guid ActivityId { get; set; }
public string Address1 {get; set; }
}
然后,您可以像往常一样反序列化:
Request req = JsonConvert.DeserializeObject<Request>(json);
小提琴:https://dotnetfiddle.net/tAp1Py
内容总结
以上是互联网集市为您收集整理的c# – 将名称/值对反序列化为对象全部内容,希望文章能够帮你解决c# – 将名称/值对反序列化为对象所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。