嵌入对象的JSON.NET反序列化问题

时间:2014-05-18 04:04:28

标签: c# javascript asp.net json json.net

我遇到了一个古怪的问题,因为我的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();
      }
    }
  }

0 个答案:

没有答案