C# 如何告诉JsonWriter根据条件什么也不做?
我面临一个案例,在我的JsonConverter中,我希望JsonWriter什么都不做 我的第一次尝试是写:C# 如何告诉JsonWriter根据条件什么也不做?,c#,json,json.net,C#,Json,Json.net,我面临一个案例,在我的JsonConverter中,我希望JsonWriter什么都不做 我的第一次尝试是写: public override void WriteJson(JsonWriter writer, IFoo<decimal> degrees, JsonSerializer serializer) { var enumerable = Convert(degrees); if (enumerable != null) JToken.From
public override void WriteJson(JsonWriter writer, IFoo<decimal> degrees, JsonSerializer serializer)
{
var enumerable = Convert(degrees);
if (enumerable != null)
JToken.FromObject(enumerable).WriteTo(writer);
}
json输出为:
{
"foo": null
}
但是我想要的是一个没有foo的对象:{}
我知道我可以使用NullValueHandling.Ignore
设置属性,但在某些情况下,我希望保持null
我想要一些像:
public override void WriteJson(JsonWriter writer, IFoo<decimal> degrees, JsonSerializer serializer)
{
var enumerable = Convert(degrees);
if (enumerable != null)
JToken.FromObject(enumerable).WriteTo(writer);
else
writer.Skip(); // or writer.Ignore() or writer.DoNothing() or whatever
}
public override void WriteJson(JsonWriter-writer、IFoo-degrees、JsonSerializer-serializer)
{
变量可枚举=转换(度);
if(可枚举!=null)
JToken.FromObject(可枚举).WriteTo(writer);
其他的
writer.Skip();//或writer.Ignore()或writer.DoNothing()或其他
}
如何告诉JsonWriter什么也不做?将
writer.WriteStartObject
、WriteEndObject
或WriteRaw
组合起来会起作用吗?另外,WriteUndefined
可能是一个选项。WriteUndefined()
writes{“foo”:undefined}
。我尝试了WriteRaw(string.Empty)
,但它抛出了一个错误。StartObj和EndObj将创建{foo:{}
,不是吗?我认为这不是JsonConverter
可以控制的,它只对值本身负责。此时父对象已经编写了属性名,而父对象又不知道转换器将如何工作。请查看ShouldSerializeX
机制。JsonConverter
无法阻止写入值,因为属性名称已写入。看见相反,您可以使用条件属性序列化,请参阅。事实上,我认为你的问题是这两个问题的重复,同意吗?@dbc这些链接肯定很有帮助。第一个问题回答了“为什么不可能`为什么没有函数Skip()之类的东西?”
在writer中。第二种方法包含了不同的方法来回答这个问题。我正在研究哪种方法最适合这种情况。将writer.WriteStartObject
、WriteEndObject
或WriteRaw
组合使用可能是一种选择。WriteUndefined
efined()写入{“foo”:undefined}
。我尝试了WriteRaw(string.Empty)
,但它抛出了一个错误。StartObj和EndObj将创建{“foo”:{}
,不是吗?我认为这不是一个JsonConverter
可以控制的东西,它只负责值本身。属性名已经由父对象在那一点上写入,而父对象又不知道转换器将如何工作。请看一下应该序列化eX
机制。JsonConverter
无法阻止写入值,因为属性名称已被写入。请参阅。相反,您可以使用条件属性序列化,请参阅。事实上,我认为您的问题是这两个组合的重复,同意吗?@dbc这些链接绝对有用。第一个回答以下问题:“为什么不可能`以及为什么编写器中没有函数Skip()
”。第二种方法包含了回答这个问题的不同方法。我正在调查这件事,看看哪一件适合这个案子。
public override void WriteJson(JsonWriter writer, IFoo<decimal> degrees, JsonSerializer serializer)
{
var enumerable = Convert(degrees);
if (enumerable != null)
JToken.FromObject(enumerable).WriteTo(writer);
else
writer.Skip(); // or writer.Ignore() or writer.DoNothing() or whatever
}