【问题标题】:Newtonsoft Json DeserializeObject Complex TypeNewtonsoft Json DeserializeObject 复杂类型
【发布时间】:2013-11-22 22:33:24
【问题描述】:

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

我希望我已经解释得足够好。我真的很感激帮助。谢谢

【问题讨论】:

  • 不确定我能辨别问题
  • 从您给出的答案看来,您对我想要实现的目标有所了解。我添加了一条评论以帮助更好地解释问题。

标签: c# json json.net


【解决方案1】:

这可以通过自定义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

【讨论】:

  • 谢谢,这看起来像我所追求的。直到明天我才能对此进行测试,如果它运行良好,那么我会将其标记为答案。再次感谢。
  • 没问题;很乐意提供帮助。
  • 我刚刚开始测试它,它很有效。感谢您的帮助。
【解决方案2】:
var ex2 = JsonConvert.DeserializeObject("{\"Form\": {\"Id\": \"2\"}}", typeof(FormParameters));

【讨论】:

  • 谢谢,但不幸的是我无法更改传递给反序列化方法的字符串。我想知道反序列化方法内部是否有任何连接,例如 asp.net mvc 模型绑定,如果它尝试绑定具有特定属性的属性,我可以自定义绑定。
猜你喜欢
  • 1970-01-01
  • 2014-03-21
  • 2021-11-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-12-22
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多