gpt4 book ai didi

c# - 使用 Json.Net 仅序列化简单类型

转载 作者:太空狗 更新时间:2023-10-29 17:50:49 26 4
gpt4 key购买 nike

我不确定为什么还没有人问过这个问题,但我正在尝试使用 IContractResolver 仅序列化给定对象的简单类型。界面。我真的不想使用 ShouldSerialize 标记每个属性方法或 JsonDataAttribute或类似的东西。

到目前为止,我在 LinqPad 上所做的如下所示

一些要序列化的示例类

class Customer
{
public List<Order> Orders {get;set;}
public int CustomerId {get;set;}
public string[] Addresses {get;set;}
}

class Order
{
public int OrderId{get;set;}
public string Name {get;set;}
public int Amount {get;set;}
public Order PreviousOrder {get;set;}
}

序列化所有对象的扩展方法

static class ExtensionMethods
{
public static string JsonSerialize (this object obj)
{
var settings = new JsonSerializerSettings();
settings.ContractResolver = new MyContractResolver();
settings.DefaultValueHandling = DefaultValueHandling.Ignore;
settings.ReferenceLoopHandling = ReferenceLoopHandling.Ignore;
return JsonConvert.SerializeObject(obj,settings);
}
}

我的自定义合约解析器类

public class MyContractResolver: DefaultContractResolver
{
protected override JsonProperty CreateProperty(MemberInfo member, MemberSerialization memberSerialization)
{
var property = base.CreateProperty(member,memberSerialization);
property.ShouldSerialize = instance => instance.GetType().IsPrimitive || instance.GetType() == typeof(string) || instance.GetType() == typeof(decimal);
return property;
}
}

和主要方法:

void Main()
{
var customer = new Customer
{
Orders = ProduceSomeOrders(),
Addresses = new string[] {"9450 S. Small Street Dr.","9521 Flintstone Dr. S"},
CustomerId = 1
};

var jsonOrder = customer.JsonSerialize();
jsonOrder.Dump();
}

我只想序列化样本类型,例如 int , double , string , decimal , bool等等,但不是数组、集合、自定义对象等,它只会导航到第一级,而不是第二级或更多级。我真的很奇怪为什么在 Json.Net 中没有任何简单的方法可以做到这一点。

这是我运行此代码时的输出:(一个空的 json)

{ }

当我运行这段代码时,我意识到一件事,第一个 member传递给 CreateProperty 的参数方法是主要对象本身,在本例中是 Customer实例。但是因为这适用于所有类型,所以我不想说 instance.GetType() == typeof(Customer)或方法中的类似内容。这种情况下的预期输出仅为 CustomerId在这种情况下。

你知道处理我的问题的优雅方式吗?

最佳答案

通过更改下面的方法,我得到了结果:{"CustomerId":1}。这是您要找的吗?

public class MyContractResolver:DefaultContractResolver
{
protected override JsonProperty CreateProperty(MemberInfo member, MemberSerialization memberSerialization)
{
var property = base.CreateProperty(member,memberSerialization);

var propertyType = property.PropertyType;
if(propertyType == typeof(int)
|| propertyType == typeof(string)){
property.ShouldSerialize = instance => true;
}
else
{
property.ShouldSerialize = instance => false;
}
return property;
}
}

关于c# - 使用 Json.Net 仅序列化简单类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15929848/

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