gpt4 book ai didi

serialization - Newtonsoft.json JsonConvert.SerializeObject - 仅序列化第一级 - MaxDepth 不适用于序列化

转载 作者:行者123 更新时间:2023-12-04 17:29:30 26 4
gpt4 key购买 nike

我只需要通过 JsonConvert.SerializeObject 序列化对象的第一层。我试过 MaxDepth = 1,但此属性仅用于反序列化。

期望的行为(属性栏缺失或为空):

class Foo
{
public int First { get; set; } = 123;
public string Second { get; set; } = "smurf";
public DateTime Third { get; set; } = DateTime.Now;
public Bar Bar { get; set; } = new Bar { Fourth = 999 };

}

class Bar
{
public int Fourth { get; set; }
}

void Test(){
var foo = new Foo();
var jsonResult = JsonConvert.SerializeObject(foo);

// jsonResult:
// {
// "First": 123,
// "Second": "smurf",
// "Third": "6.4. 2020 7:16",
// }
}

我应该如何设置 JsonConvert.SerializeObject 以忽略序列化中的子非原始对象?非常感谢。

最佳答案

我找到了解决方案。

我做了一个自定义的 JsonConverter:

    public class OnlyPrimitiveJsonConverter : JsonConverter
{
private readonly Type[] _types;

public OnlyPrimitiveJsonConverter(params Type[] types)
{
_types = types;
}

public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
{
JToken t = JToken.FromObject(value, new JsonSerializer()
{
ReferenceLoopHandling = ReferenceLoopHandling.Ignore
});

if (t.Type != JTokenType.Object)
{
t.WriteTo(writer);
}
else
{
JObject o = (JObject)t;

var propertiesToRemove = new List<string>();

foreach (var prop in value.GetType().GetProperties())
{
if (
!prop.PropertyType.IsPrimitive &&
!prop.PropertyType.IsValueType &&
prop.PropertyType != typeof(string)
)
{
propertiesToRemove.Add(prop.Name);
}
}

foreach (var propToRemove in propertiesToRemove)
{
o.Remove(propToRemove);
}

o.WriteTo(writer);
}
}

public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
{
throw new NotImplementedException("Unnecessary because CanRead is false. The type will skip the converter.");
}

public override bool CanRead
{
get { return false; }
}

public override bool CanConvert(Type objectType)
{
return _types.Any(t => t == objectType);
}
}

我没有宣称它完美无缺,但它对我有用。它只是删除了非原始类型和非值类型。

关于serialization - Newtonsoft.json JsonConvert.SerializeObject - 仅序列化第一级 - MaxDepth 不适用于序列化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61053394/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com