当为null或Count = 0时序列化List <t>属性

时间:2018-03-20 12:35:46

标签: c# serialization json.net

我有这个课程:

    public class EncuestaRespuesta
    {
        public string idCaso { get; set; }
        public string tipoEncuesta { get; set; }
        public string codMovimiento { get; set; }
        public string motivoRetirada { get; set; }
        public string duracion { get; set; }
        public DateTime fechaHora { get; set; }
        public string gestor { get; set; }
        public List<RespuestasEncuesta> listRespuestasEncuestas { get; set;}
    }

    public class RespuestasEncuesta
    {
        public string pregunta { get; set; }
        public string respuesta { get; set; }
        public string numOrdenTrabajo { get; set; }
    }

列表 listRespuestasEncuestas null Count = 0

使用JSON.NET,

    // https://www.newtonsoft.com/json/help/html/NullValueHandlingIgnore.htm
    var settings = new JsonSerializerSettings
    {
        NullValueHandling = NullValueHandling.Ignore
    };

    settings.Converters.Add(new Newtonsoft.Json.Converters.IsoDateTimeConverter()); // "fechaHora": "2018-02-23T12:42:52.4456475+01:00",

    var json = JsonConvert.SerializeObject(request, Formatting.Indented, settings);

结果:

{
  "idCaso": "5009E000007Hp94QAC",
  "tipoEncuesta": "T3_1018_RM",
  "codMovimiento": "1",
  "motivoRetirada": "2",
  "duracion": "0",
  "fechaHora": "2018-03-20T09:18:00",
  "gestor": null,
  "listRespuestasEncuestas": []
}

我想要这个JSON字符串:

{
  "idCaso": "5009E000007Hp94QAC",
  "codMovimiento": "1",
  "motivoRetirada": "1",
  "duracion": "",
  "fechaHora": "2018-02-06T14:40:43.511Z",
  "gestor": "",
  "tipoEncuesta": "T3_1018_RM",
  "listRespuestasEncuestas": [
    {
      "numOrdenTrabajo": "",
      "pregunta": "",
      "respuesta": ""
    }
  ]
}

有什么建议吗?

1 个答案:

答案 0 :(得分:4)

您可以在Json.NET中使用serialization callbacks在序列化空列表或空列表时伪造空值。

e.g。

[OnSerializing]
void OnSerializingMethod(StreamingContext context)
{
    if (listRespuestasEncuestas == null)
    {
        listRespuestasEncuestas = new List<RespuestasEncuesta>();
    }
    if (!listRespuestasEncuestas.Any())
    {
        //Add an empty item to the list.
    }
}

[OnSerialized]
void OnSerializedMethod(StreamingContext context)
{
    //if the list contains a single empty item, remove it and return the list to either empty or null.
}

[OnDeserialized]
void OnDeserializedMethod(StreamingContext context)
{
    //What to do if we receive a list with a single empty item? Do you want to keep it? Decide here.
}

应该说,这是一个非常规的要求,很难看到实施它的任何价值。