Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/284.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何告诉JsonWriter根据条件什么也不做?_C#_Json_Json.net - Fatal编程技术网

C# 如何告诉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

我面临一个案例,在我的JsonConverter中,我希望JsonWriter什么都不做

我的第一次尝试是写:

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
}