gpt4 book ai didi

c# - JSON.NET 序列化(如果重写 ToString)

转载 作者:太空狗 更新时间:2023-10-29 20:33:56 26 4
gpt4 key购买 nike

我有一组复杂的业务对象,我想将其序列化为 Json 以便在 Web 服务中使用。我目前正在使用 DataContractJsonSerializer 来生成 Json,但由于默认的 XmlReader 无法处理 Base64 字符串,所以它无法进行反序列化。

在阅读了 Json.Net 的许多正面评论后,我决定试一试。令人惊讶的是,如果业务对象覆盖 ToString() 方法,最简单的情况会产生错误的输出。它不生成 JSON,而是简单地发出字符串值。

例如,以下语句仅生成一个字符串,因为序列化程序似乎将该对象视为一个简单的字符串。

public class MyClass {
public string Title{get;set;}
public override ToString(){ return Title; }
public string ToJson(){
return JsonConvert.SerializeObject(this);
}
}

我得到的不是 json 格式的输出,而是标题字符串。我是否必须以某种特殊方式标记对象以避免这种情况?由于业务对象层次结构包括许多覆盖 ToString() 的对象,我宁愿避免引入特殊属性等。

最佳答案

您的实际类是否可能附加了 TypeConverterAttribute?我刚遇到完全相同的问题,发现是 TypeConverterAttribute 造成的。在这种情况下,this可能会有所帮助(至少对我有用)。

这非常糟糕,因为您可能会无意中破坏您的程序(通过简单地添加一个 TypeConverter 可能用于在 PropertyGrid 中显示对象)而不会收到编译器警告...

using Newtonsoft.Json;
using System;
using System.ComponentModel;

namespace ConsoleApplication5
{
class Program
{
static void Main(string[] args)
{
var with = new WithTypeConverter() { Bla = 12, Blub = "With" };
var without = new WithoutTypeConverter() { Bla = 12, Blub = "Without" };

Console.WriteLine(with);
Console.WriteLine(JsonConvert.SerializeObject(with));

Console.WriteLine(without);
Console.WriteLine(JsonConvert.SerializeObject(without));
Console.ReadKey();
}
}

public class baseClass
{
public int Bla { get; set; }
public string Blub { get; set; }

public override string ToString()
{
return String.Format("{0}: {1}", this.GetType().Name, Blub);
}
}

[TypeConverter(typeof(ExpandableObjectConverter))]
public class WithTypeConverter : baseClass
{
}

public class WithoutTypeConverter : baseClass
{
}
}

关于c# - JSON.NET 序列化(如果重写 ToString),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19036234/

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