簡體   English   中英

json字符串反序列化到自定義對象

[英]json string deserialization to custom object

我在閱讀可用帖子后發布此問題。 我有一個具有以下方法的ASP.NET Web API控制器。

[DataContract]
public class CustomPerson
{
    [DataMember]
    public ulong LongId { get; set; }
}

[DataContract]
public class Employee : CustomPerson
{
    [DataMember]
    public string Name { get; set; }

    [DataMember]
    public string Address { get; set; }
}

然后在控制器中

public class CustomController : ApiController
{
    [HttpPost]
    [ActionName("AddEmployee")]
    public bool AddEmployee(Employee empInfo)
    {
        bool bIsSuccess = false;

        // Code loginc here
        bIsSuccess = true;

        return bIsSuccess;
    }

    [HttpPost]
    [ActionName("AddEmployeeCustom")]
    public async Task<bool> AddEmployeeCustom()
    {
        string rawRequest = await Request.Content.ReadAsStringAsync();
        bool bIsSuccess = false;

        // Code loginc here

        try
        {
            Employee emp = JsonConvert.DeserializeObject<Employee>(rawRequest);
        }
        catch (Exception ex)
        { }

        return bIsSuccess;
    }
}

當我通過soap ui調用AddEmployee的以下請求時,收到的自定義對象沒有錯誤,即LongId的空值被忽略

{
    "Name": "test1",
    "Address": "Street 1",
    "LongId": ""
}

當我調用AddEmployeeCustom方法時,運行時將引發異常:

Error converting value "" to type 'System.UInt64'. Path 'LongId', line 4, position 14.

我讀過的一個選項是將傳入的字符串轉換為JObject,然后創建Employee類的對象,但是當控制器自動處理傳入的請求並將其反序列化為Employee對象時,我試圖理解並模仿默認請求處理機制的行為。

問題是您的JSON對您的模型無效。

在第一種方法AddEmployee中,發生了稱為模型綁定的過程。 MVC完成將帖子內容轉換為對象的工作。 看起來可以容忍輸入不匹配並原諒您的空字符串。

在第二種情況下,您嘗試自己進行操作,並嘗試簡單地運行反序列化而不驗證輸入數據。 Newtonsoft JSON無法識別空字符串並崩潰。

如果仍然需要接受無效的JSON,則可能需要通過實現自定義轉換器來覆蓋默認的反序列化過程

public class NumberConverter : JsonConverter
{
    public override bool CanWrite => false;

    public override bool CanConvert(Type objectType)
    {
        return typeof(ulong) == objectType;
    }

    public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
    {
        var value = reader.Value.ToString();

        ulong result;
        if (string.IsNullOrEmpty(value) || !ulong.TryParse(value, out result))
        {
            return default(ulong);
        }

        return result;
    }

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

然后在調用反序列化時指定您的自定義轉換器實例

return JsonConvert.DeserializeObject<Employee>(doc.ToJson(), new NumberConverter());

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM