我正在使用JSON.NET来序列化我的一些对象,我想知道是否有一种简单的方法来覆盖特定对象的默认json.net转换器?
目前我有以下课程:
public class ChannelContext : IDataContext
{
public int Id { get; set; }
public string Name { get; set; }
public IEnumerable<INewsItem> Items { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
JSON.NET目前序列化如上:
{
"Id": 2,
"Name": "name value",
"Items": [ item_data_here ]
}
Run Code Online (Sandbox Code Playgroud)
是否可能只针对该特定类以这种方式格式化它:
"Id_2":
{
"Name": "name value",
"Items": [ item data here ]
}
Run Code Online (Sandbox Code Playgroud)
我是JSON.NET的新手..我想知道上面是否与编写自定义转换器有关.我无法找到关于如何写一个的具体例子.如果有人能指出我的具体来源,我会非常感激.
我需要找到一个解决方案,使特定类始终转换相同,因为上面的上下文是更大的上下文的一部分,JSON.NET默认转换器转换得很好.
希望我的问题足够明确......
更新:
我已经找到了如何创建一个新的自定义转换器(通过创建一个继承自JsonConverter的新类并覆盖它的抽象方法),我重写了WriteJson方法,如下所示:
public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
{
ChannelContext contextObj = value as ChannelContext;
writer.WriteStartObject();
writer.WritePropertyName("id_" + contextObj.Id); …Run Code Online (Sandbox Code Playgroud) 我正在将一些属性反序列化为a Dictionary<string, object>.
当我反序列化JSON一些,它填充Dictionary与Int64对象,而不是Int32.我希望它能够选择Int32作为默认值,知道我可以使用转换时会溢出的javascript数字.在这种情况下抛出异常是完全可以接受的.
有没有办法实现这一目标?我希望有一些很好的属性或一个方便的界面,可以实现并添加到JsonSerializer.而且我担心我必须深入到Json.NET的深处.
基本上我想有一些方法来控制对象的已知类型,这样我就可以Int32代替Int64而DateTimes不是代替Strings.
有没有办法从类中取出设置JsonSerializer并重新实现它们JsonSerializer?
似乎没有任何方法可以做这样的事情.我找到的最好的是通过反射调用的私有方法ApplySerializerSettings.
我正在尝试从WriteJson方法中获取序列化程序并将其复制到新的序列化程序中,稍微调整一下.具体来说我想替换ContractResolver.
public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
Run Code Online (Sandbox Code Playgroud) 我将JSON对象保存到数据库中,有时它会变得很大(我的对象长度为205,797个字符),我想尽可能地消除大小。这些对象有很多我不需要的GUID字段,如果有一种方法可以忽略序列化的任何GUID类型,则可能有助于消除大小。
这是我的代码,我在应用程序中传递了任何模型类型的对象:
public static string GetEntityAsJson(object entity)
{
var json = JsonConvert.SerializeObject(entity, Formatting.None, new JsonSerializerSettings
{
ReferenceLoopHandling = ReferenceLoopHandling.Ignore
});
return json;
}
Run Code Online (Sandbox Code Playgroud)
编辑
我不想使用JsonIgnore属性,因为我必须将其添加到这么多的类中,每个类都具有许多GUID属性,我正在寻找一些简单的方法:
IgnoreDataType = DataTypes.GUID