[英]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.