【问题标题】:How to serialize field of type class as main object fields with NewtonSoft json?如何使用 NewtonSoft json 将类型类的字段序列化为主要对象字段?
【发布时间】:2015-06-25 09:24:20
【问题描述】:

假设我有这些类:

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;
}

现在,当我想加载AB 对象时,我想使用JSON.Net JsonConverter 注释来序列化C,如下所示。例如这样的:

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

序列化AB对象的结果应该是这样的:

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

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

我不知道我应该如何实现JsonConverterCustomImpl 类。

更新

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

Newtonsoft.Json.dll 中出现“System.StackOverflowException”类型的未处理异常

更新

见下图,C 类在我的应用程序中是 Attachment,许多模型可能包含它。 Attachment 类有一个 byte[] fileContent 字段,其中包含上传的文件内容。所以我想将这个类序列化为扁平容器类,以便在UI 侧轻松访问fileContent

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

注意 我将fileContent 序列化为base64 string

【问题讨论】:

  • 您能稍微澄清一下您的问题吗? 1) 为什么需要C 上的转换器? 2)你的困难是序列化,还是反序列化? 3)你想为C创建什么json?
  • @dbc 更新问题,请查收。
  • 为什么不简单地在基类中添加一个virtual byte[] fileContent { get { return null; } },然后在C 中覆盖它?

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


【解决方案1】:

找到了一种使用 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

【讨论】:

    【解决方案2】:

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

    public class A : C
    {
       public int aField;
    }
    
    public class B : C
    {
       public string bField;
    }
    

    如果存在排除此解决方案的限制条件,请考虑编辑问题。

    【讨论】:

    • 我不能这样做,因为每个 AB 都是从名为 BaseEntity 的类扩展而来的,AB 类是我使用的实体类数据层。
    猜你喜欢
    • 1970-01-01
    • 2012-07-04
    • 1970-01-01
    • 2019-03-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多