8

Web サービスで使用するために Json にシリアライズしたい一連の複雑なビジネス オブジェクトがあります。私は現在 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() をオーバーライドする多くのオブジェクトが含まれているため、特別な属性などを導入する必要はありません。

4

4 に答える 4

4

実際のクラスに TypeConverterAttribute が添付されている可能性はありますか? 私はまったく同じ問題に遭遇し、TypeConverterAttribute がこれを引き起こしていることがわかりました。その場合、これが役立つかもしれません(少なくとも私にとってはそうでした)。

これは、コンパイラの警告を表示せずに (PropertyGrid にオブジェクトを表示するために TypeConverter を追加するだけで) プログラムを誤って壊す可能性があるため、非常に悪いことです...

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
    {
    }
}
于 2016-08-24T12:02:03.293 に答える
1

これを間違ってテストしている可能性があります。LINQPad で次のコードを実行しました。

void Main()
{
    new MyClass{Title = "hi"}.ToJson().Dump();
}

// Define other methods and classes here
public class MyClass {
    public string Title{get;set;}
    public override string ToString(){ return Title; }
    public string ToJson(){ 
        return JsonConvert.SerializeObject(this); 
    }
}

出力:

{"Title":"hi"}
于 2013-09-26T18:52:12.457 に答える