Newtonsoft Json DeserializeObject复杂类型

时间:2013-11-22 22:33:24

标签: c# json json.net

我使用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属性添加一个属性。请注意,任何解决方案都不得破坏第一个示例。

我希望我已经解释得这么好了。我非常感谢你的帮助。感谢

2 个答案:

答案 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));