【发布时间】:2014-08-22 08:39:23
【问题描述】:
好的,我有 WebApi 应用程序,它会像这样发回名称值对
{'FirstName':'SomeGuy'}
在服务器上,FirstName 字段不仅仅是一个字符串,它是一个通用对象,包含有关 FirstName 的附加信息,并且不会从客户端发回。
这是课程大纲
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); }
}
}
所以..理论上我可能会尝试绑定到类似的模型
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?我不能更强烈地推荐它。让你的 JsonConverter 变得非常困难......你必须担心很多边缘情况才能使其正确和完整。 JSON.NET 经过了良好的测试、信任和几乎所有人的使用,并作为 NuGet 包分发。你还能想要什么!事实上,如果您使用的是 ASP.NET Web API,那么您已经在使用它了……Web API 使用 JSON.NET 在内部处理 JSON 解析。我的建议:节省时间,只使用 JSON.NET
-
我正在使用 JSON.Net JsonConverter 是重写自定义 JSON.Net 序列化和反序列化的基类
标签: c# asp.net-web-api json.net