gpt4 book ai didi

c# - JSON.Net 将 json 对反序列化为对象属性

转载 作者:行者123 更新时间:2023-11-30 18:28:40 25 4
gpt4 key购买 nike

好的,我有一个像这样发回名称值对的 WebApi 应用程序

{'FirstName':'SomeGuy'}

在服务器上,FirstName 字段不仅仅是一个字符串,它是一个通用对象,包含有关 FirstName 的附加信息,并且不会从客户端发回。

这是类(class)的大纲

public abstract class Field
{
protected object _value;
......More Properties/Methods
public bool HasValue
{
get { return _hasValue; }
}

public object Value
{
get { return _hasValue ? _value : null; }
}

protected void SetValue(object value, bool clearHasValue = false)
{
_value = value;
_hasValue = clearHasValue ?
false :
value != null;
}
}

public class Field<T> : Field
{
..Constructors and methods
public new T Value
{
get { return _hasValue ? (T)_value : default(T); }
set { SetValue(value); }
}
}

所以..理论上我可能会尝试绑定(bind)到一个模型上

 class FieldModel
{
public Field<string> FirstName { get; set; }
public Field<string> LastName { get; set; }
public Field<Decimal> Amount { get; set; }

public FieldModel()
{
FirstName = new Field<string>();
LastName = new Field<string>();
Amount = new Field<decimal>();
}
}

所以这就是问题所在。我希望我的 json 对象中的 FirstName 反序列化为正确的属性。现在,如果我将 json 包修改为 {'FirstName.Value':'SomeGuy'} JSON.net 开箱即用,但我真的不会那样做。我一直想制作自己的 JsonConverter,但没能让它发挥作用。所以,我不认为这应该很难,但我有点卡住了。

编辑

所以..我确实想出了一个可行的解决方案,但我不得不认为有更好的方法..它使用动态,我不得不认为我缺少一个简单的解决方案。

public class FieldConverter : JsonConverter
{
public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
{
if (reader.TokenType == JsonToken.Null)
{
return null;
}
var internalVal = serializer.Deserialize(reader, objectType.GetGenericArguments().FirstOrDefault());
var retVal = existingValue as dynamic;
retVal.Value = internalVal as dynamic;
return retVal;
}

public override bool CanRead
{
get { return true; }
}

public override bool CanWrite
{
get { return false; }
}

public override bool CanConvert(Type objectType)
{
return objectType.IsSubclassOf(typeof(Field));
}

public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
{
throw new NotImplementedException();
}
}

最佳答案

您可以使用 JSON.NET 的 CustomCreationConverter 轻松完成此操作。这是一个 example :

public class Person
{
public string FirstName { get; set; }
public string LastName { get; set; }
public DateTime BirthDate { get; set; }
}

public class Employee : Person
{
public string Department { get; set; }
public string JobTitle { get; set; }
}

public class PersonConverter : CustomCreationConverter<Person>
{
public override Person Create(Type objectType)
{
return new Employee();
}
}

以及用法:

string json = @"{
'Department': 'Furniture',
'JobTitle': 'Carpenter',
'FirstName': 'John',
'LastName': 'Joinery',
'BirthDate': '1983-02-02T00:00:00'
}";

Person person = JsonConvert.DeserializeObject<Person>(json, new PersonConverter());

Console.WriteLine(person.GetType().Name);
// Employee

Employee employee = (Employee)person;

Console.WriteLine(employee.JobTitle);
// Carpenter

关于c# - JSON.Net 将 json 对反序列化为对象属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24516148/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com