我遇到了一个古怪的问题,因为我的WebAPO 2.1代码中的JSOn反序列化在所有情况下似乎都没有正常工作。
当我有简单的对象和填充了所有数据的对象时,它可以正常工作,但是,如果我的任何嵌入对象都是null,因为通过jQuery的ajax调用从浏览器发送,就会出错。< / p>
在下面的示例中,对象的EntityId属性(在基类中找到)放在派生类的PreferredSpecialty属性中,基类的属性为null,首选的Species为null。 preferredLocallity按预期填写。
我下载了JSON.NET源代码,并在各种调用中使用相同的JSON.Net版本构建了多个测试,并且我无法在WebAPI调用之外复制结果。
以下是我的问题:
有没有人看到代码有什么问题(如下),或者知道/有一个测试代码片段可以模仿ASP.NET Web API 2.1调用JSON.Net库的方式来进行反序列化?
我有一些javascript代码调用WebAPI 2.1方法,其占用空间为:
[Route("api/Reservation/{Id}")]
public object Put(int Id, [FromBody] Reservation model)
发送的json(通过JQuery就是这个):
{
"confirmationNumber":"Test_Value",
"requiresHandicapAccessible":false,
"totalIndividuals":1,
"adultIndividuals":1,
"seniorIndividuals":0,
"childIndividuals":0,
"comments":"",
"totalPrice":225,
"preferredLocality":{"id":1469,"pid":"PR"},
"preferredSpecies":null,
"preferredSpecialty":null,
"entityId":{"id":1035,"pid":"PR"},
}
表示此数据的C#类如下:
public class EntityId
{
public int Id { get; set; }
public string PID { get; set; }
}
public class DataObjectBASE : EntityBASE
{
public EntityId EntityId { get; set; }
public ObjectDetails Details { get; set; }
}
public class Reservation : DataObjectBASE
{
public string ConfirmationNumber { get; set; }
public bool? RequiresHandicapAccessible { get; set; }
public int TotalIndividuals { get; set; }
public int AdultIndividuals { get; set; }
public int SeniorIndividuals { get; set; }
public int ChildIndividuals { get; set; }
public string Comments { get; set; }
public decimal TotalPrice { get; set; }
public EntityId PreferredLocality { get; set; }
public EntityId PreferredSpecies { get; set; }
public EntityId PreferredSpecialty { get; set; }
}
如果没有为EntityId编写自定义JSONConverter(如下所示),我无法得到这样的工作:
public class EntityIdConverter : JsonConverter
{
public override bool CanConvert(Type objectType)
{
return objectType.Equals(typeof(EntityId));
}
public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
{
int? iId = null;
string strPID = string.Empty;
while(reader.TokenType != JsonToken.EndObject)
{
//-- Read a Property...
reader.Read();
if(reader.TokenType == JsonToken.PropertyName)
{
string strPropertyName = DataUtilities.ObjectAsString(reader.Value);
//-- Read the value
if(strPropertyName.Equals("id", StringComparison.OrdinalIgnoreCase))
{
iId = reader.ReadAsInt32();
}
else
{
if(strPropertyName.Equals("pid", StringComparison.OrdinalIgnoreCase))
{
strPID = reader.ReadAsString();
}
else
{
// Unexpected property, ignore it...
reader.Read();
}
}
}
}
if(iId != null)
{
return new EntityId(iId.Value, strPID);
}
else
{
return null;
}
}
public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
{
var model = value as EntityId;
if(model != null)
{
writer.WriteStartObject();
writer.WritePropertyName("id");
writer.WriteValue(model.Id);
writer.WritePropertyName("pid");
writer.WriteValue(model.PID);
writer.WriteEndObject();
}
else
{
writer.WriteNull();
}
}
}