簡體   English   中英

Newtonsoft Json DeserializeObject復雜類型

[英]Newtonsoft Json DeserializeObject Complex Type

我使用Newtonsoft Json庫對json進行序列化/反序列化。 例如說我有以下幾種類型:

public class Form {
    public int Id { get; set; }
}

public class FormParameters {
    public Form Form { get; set; }
}

現在說我嘗試以下方法:

var ex1 = JsonConvert.DeserializeObject("{\"Id\": \"2\"}", typeof(Form));

正確反序列化對象。 但是我希望以下工作:

var ex2 = JsonConvert.DeserializeObject("{\"Form\": \"2\"}", typeof(FormParameters));

來自表單的值(在上面的示例中為2)將針對FormParameters類的Form屬性映射到id。 不幸的是,傳遞給反序列化方法的字符串是固定的,我無法更改。 理想情況下,我想要向FormParameters類的Form屬性添加一個屬性。 請注意,任何解決方案也不得破壞第一個示例。

我希望我已經解釋得足夠好了。 我非常感謝您的幫助。 謝謝

這可以通過自定義JsonConverter來完成。 可能是這樣的:

public class FormParamsConverter : JsonConverter
{
    public override bool CanConvert(Type objectType)
    {
        return (objectType == typeof(FormParameters));
    }

    public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
    {
        JObject jo = JObject.Load(reader);
        int id = jo["Form"].Value<int>();
        FormParameters fp = new FormParameters 
        { 
            Form = new Form { Id = id } 
        };
        return fp;
    }

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

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

要使用它,您可以使用[JsonConverter]屬性來裝飾FormParameters類,如下所示:

[JsonConverter(typeof(FormParamsConverter))]
public class FormParameters
{
    public Form Form { get; set; }
}

public class Form
{
    public int Id { get; set; }
}

這是一個演示如何運行轉換器的快速演示:

class Program
{
    static void Main(string[] args)
    {
        string json = "{\"Form\": \"2\"}";

        FormParameters fp = JsonConvert.DeserializeObject<FormParameters>(json);

        Console.WriteLine("Form Id = " + fp.Form.Id);
    }
}

輸出:

Form Id = 2
var ex2 = JsonConvert.DeserializeObject("{\"Form\": {\"Id\": \"2\"}}", typeof(FormParameters));

暫無
暫無

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

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