如何使用NewtonSoft json将类型类的字段序列化为主对象字段?

时间:2015-04-18 12:53:32

标签: c# asp.net json serialization json.net

假设我有这些课程:

public class BaseEntity 
{
    public int id;
}

public class A : BaseEntity
{
    public int aField;
    public C c;
}

public class B : BaseEntity
{
    public string bField;
    public C c;
}

public class C : BaseEntity
{
    public string cField;
}

现在,当我想加载JsonConverterC个对象时,我想使用JSON.Net A注释序列化B,如下所示。例如:

[JsonConverter(typeof(JsonConverterCustomImpl))]
public class C
{
    public string cField;
}

,序列化的AB对象的结果应如下所示:

// A object
{
   id: 0,
   aField: 0,
   cField: ''
}

// B object
{
   id: 0,
   bField: 0,
   cField: ''
}

我不知道shoud = ld我是如何实现JsonConverterCustomImpl类的。

更新

我使用this回答,也定义了FlattenJsonConverter类并将其设置为AB的JsonAnnotation,但是当我运行项目时,抛出异常:

未处理的类型' System.StackOverflowException'发生在Newtonsoft.Json.dll

enter image description here

更新

请参见下图,我的应用程序中的C类为Attachment,许多模型可能包含该类。 Attachment类有一个byte[] fileContent字段,其中包含上传的文件内容。因此,我希望将此类序列化为容器类,以便轻松访问fileContentUI

我找到了this序列化C类flatten的方法,但是在注释中使用JsonConverter时会抛出异常。

注意 我将fileContent序列化为base64 string

enter image description here

2 个答案:

答案 0 :(得分:0)

找到一种简单地使用Newtonsoft.Json序列化对象的方法 (http://blog.bitlinkit.com/custom-json/

public ActionResult hello()
{
    dynamic d = new JObject();
    d.MetricId = 11;
    string json = Newtonsoft.Json.JsonConvert.SerializeObject(d);
    return Content(json,"JSon");
}

无需实施JsonConverterCustomImpl

答案 1 :(得分:0)

在这种特殊情况下,您可以通过使用继承而不是组合来实现结果。 代码如下所示:

public class A : C
{
   public int aField;
}

public class B : C
{
   public string bField;
}

如果存在排除此解决方案的约束,请考虑编辑问题。