我可以在运行时使用带有 JSON.Net 的自定义序列化(删除属性)吗?
Can I use a custom serialize (remove properties) with JSON.Net at runtime?
我有一个需要序列化的对象,这个对象里面有另一个对象,我需要过滤它的属性以删除一些。例如:
class inner {
string baz = "hi";
string blah = "hide me";
}
class outer {
int foo = 7;
inner bar = new inner();
}
我能够使用 ContractResolver
,但是(据我所知)这需要单独序列化 inner
对象,这又显示为转义的 JSON字符串而不是 outer
对象的一部分,即:
{"foo":7,"bar":"{\"baz\":\"hi\"}"}
我需要的是:
{"foo":7,"bar":{"baz":"hi"}} // no blah property
我考虑过使用自定义 JsonConverter,但不确定如何仅将转换器用于 inner
对象或 "pass through" 其他所有对象,并且仅用于 运行 我的自定义过滤在 inner
对象上。
我不能用属性 (AFAIK) 来做,因为我想在其他地方序列化整个 inner
对象,这是一个全有或全无的设置。 (除非我可能会在 运行 时间添加它?)另外,如果其他东西有 blah
属性,我不想删除它......只从 inner
类型。
有办法吗?
您可以使用自定义转换器。像这样:
public class InnerSerializer : JsonConverter
{
public override bool CanConvert(Type objectType)
{
return objectType == typeof(inner);
}
public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
{
throw new NotImplementedException();
}
public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
{
var inner = value as inner;
writer.WriteStartObject();
writer.WritePropertyName("baz");
writer.WriteValue(inner.baz);
writer.WriteEndObject();
}
}
然后如果你想使用它,将它作为参数添加到 SerializeObject
:
string json = JsonConvert.SerializeObject(new outer(), new InnerSerializer());
我关于序列化的解决方案 json 始终是动态对象。我的意思是我没有使用 class。我正在为我的必需字段创建动态对象,并且正在序列化该动态对象。所以有时我不需要 class 的所有字段,我只是将必要的字段放入动态对象。这是一个非常简单的例子。
class inner
{
string baz = "hi";
string blah = "hide me";
}
class outer
{
int foo = 7;
inner bar = new inner();
}
dynamic dyn = new {
foo = outer.foo,
bar = inner
}
string json = JsonConvert.SerializeObject(dyn);
希望对您有所帮助。
我有一个需要序列化的对象,这个对象里面有另一个对象,我需要过滤它的属性以删除一些。例如:
class inner {
string baz = "hi";
string blah = "hide me";
}
class outer {
int foo = 7;
inner bar = new inner();
}
我能够使用 ContractResolver
,但是(据我所知)这需要单独序列化 inner
对象,这又显示为转义的 JSON字符串而不是 outer
对象的一部分,即:
{"foo":7,"bar":"{\"baz\":\"hi\"}"}
我需要的是:
{"foo":7,"bar":{"baz":"hi"}} // no blah property
我考虑过使用自定义 JsonConverter,但不确定如何仅将转换器用于 inner
对象或 "pass through" 其他所有对象,并且仅用于 运行 我的自定义过滤在 inner
对象上。
我不能用属性 (AFAIK) 来做,因为我想在其他地方序列化整个 inner
对象,这是一个全有或全无的设置。 (除非我可能会在 运行 时间添加它?)另外,如果其他东西有 blah
属性,我不想删除它......只从 inner
类型。
有办法吗?
您可以使用自定义转换器。像这样:
public class InnerSerializer : JsonConverter
{
public override bool CanConvert(Type objectType)
{
return objectType == typeof(inner);
}
public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
{
throw new NotImplementedException();
}
public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
{
var inner = value as inner;
writer.WriteStartObject();
writer.WritePropertyName("baz");
writer.WriteValue(inner.baz);
writer.WriteEndObject();
}
}
然后如果你想使用它,将它作为参数添加到 SerializeObject
:
string json = JsonConvert.SerializeObject(new outer(), new InnerSerializer());
我关于序列化的解决方案 json 始终是动态对象。我的意思是我没有使用 class。我正在为我的必需字段创建动态对象,并且正在序列化该动态对象。所以有时我不需要 class 的所有字段,我只是将必要的字段放入动态对象。这是一个非常简单的例子。
class inner
{
string baz = "hi";
string blah = "hide me";
}
class outer
{
int foo = 7;
inner bar = new inner();
}
dynamic dyn = new {
foo = outer.foo,
bar = inner
}
string json = JsonConvert.SerializeObject(dyn);
希望对您有所帮助。