我使用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。不幸的是,传递给deserialize方法的字符串是固定的,我无法改变它。理想情况下,我想要的是向FormParameters类的Form属性添加一个属性。请注意,任何解决方案都不得破坏第一个示例。
我希望我已经解释得这么好了。我非常感谢你的帮助。感谢
答案 0 :(得分:2)
可以使用自定义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();
}
}
要使用它,您可以使用FormParameters
属性装饰[JsonConverter]
类,如下所示:
[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
答案 1 :(得分:1)
var ex2 = JsonConvert.DeserializeObject("{\"Form\": {\"Id\": \"2\"}}", typeof(FormParameters));