【发布时间】:2020-11-11 00:26:08
【问题描述】:
我在 Newtonsoft.json 中使用 JsonConverters。他们将为我提供我将使用的自定义 WriteJson / ReadJson 代码,因此当给定的 objectType 与转换器匹配时,我需要同时触发 WriteJson / ReadJson。
我需要做的一件事是将 json 中显示的“null”关键字转换为 0。
下面是一个非常简化的 JsonConverter——它所做的只是尝试将“null”更改为 0(以及其他任何不为 null 的内容为 1)。不幸的是,我发现当 value == null 时,WriteJson 函数永远不会被触发。
using System;
using System.Collections;
using System.Collections.Generic;
using System.Runtime.Serialization;
using Newtonsoft.Json;
namespace ConsoleApp1
{
class Program
{
public class TestConverter : JsonConverter
{
public override bool CanConvert(Type objectType)
{
return objectType == typeof(B);
}
public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
{
return existingValue;
}
public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
{
/// This function never gets triggered when value is null
if (value == null)
{
writer.WriteValue(0);
}
else
{
writer.WriteValue(1);
}
}
}
public class B
{
public int C
{
get; set;
}
}
public class A
{
public B B
{
get; set;
} = null;
}
static void Main(string[] args)
{
var c = JsonConvert.SerializeObject(new A(), new JsonSerializerSettings()
{
Converters = new List<JsonConverter> { new TestConverter() }
});
Console.WriteLine(c);
}
}
}
输出:
{"B":null}
预期输出:
{"B": 0}
是否有一些设置或方法可以将“null”的所有输出转换为“0”?
【问题讨论】:
-
这是回答你的问题吗? stackoverflow.com/questions/16835188/…
-
WriteJson()永远不会为空值调用,请参阅How to force JsonConverter.WriteJson() to be called for a null value。
标签: c# serialization json.net