0

5,000 以上のJSON.NET デシリアライゼーション エラーに追加するのは嫌いですが、次の JSON で問題を引き起こしている可能性のあるものを誰か見ることができますか? JSONLint とJSONViewerの両方が、文字列が有効であると述べています。実際、JSON.NET によって問題なくシリアル化されています。それが表す Tariff オブジェクトのクラス定義も以下に示します。

これは私を完全に困惑させました-.NETのJavascriptSerialiserクラスも使用するとまったく同じ問題が発生します。正常にシリアル化されますが、逆シリアル化すると次のエラーがスローされます。

値 [以下の JSON 文字列] 'emAPI.ClassLibrary.Tariff' の変換中にエラーが発生しました。パス ''、1 行目、位置 374。

行 1 pos 374 は、文字列の末尾にある 0 と 0.5 のピリオドの間にありdouble StandingChargeValue、クラスで表されます。

解決方法についてのアイデアはありますか?

ありがとう、デビッド

JSON 文字列

{ "StandingChargePeriod": { "Id": 4, "Length": "Weekly", "NumbDays": 7 }, "Bands": [ { "Id": 24, "UpperkWhLimit": 23, "LowerkWhLimit": 0, "UnitRate": 2.4 }, { "Id": 25, "UpperkWhLimit": 0, "LowerkWhLimit": 24, "UnitRate": 5.8 }, { "Id": 26, "UpperkWhLimit": -1, "LowerkWhLimit": 0, "UnitRate": 5.8 } ], "Id": 10, "StartDate": "2012-12-07T00:00:00", "StandingChargeValue": 0.5 }

関税クラス定義

    public class Tariff
    {
        [ScaffoldColumn(false)]
        public int Id { get; set; }

        [Required]
        public DateTime StartDate { get; set; }

        [Required]
        [Range(0, 999999999)]
        public double StandingChargeValue { get; set; }

        public virtual Period StandingChargePeriod { get; set; }

        public virtual ICollection<TariffBand> Bands { get; set; }

}
4

1 に答える 1

0

OK、それで私は一晩のデバッグセッションの後にようやくそれを解決しました...

WCFシリアル化に関するこの問題と同様に、問題はEF4.3プロキシオブジェクトに再シリアル化しようとすることを中心に展開されました。これを解決するには、EFコンテキストからオブジェクトを直接返すのではなく、次のようにします。

public getTariff(int id)
{
    return context.Tariffs.Find(id);
}

新しいオブジェクトを作成し、属性をコピーして、代わりに新しいオブジェクトを返しました。

public getTariff(int id)
{
    Tariff holdingTariff = context.Tariffs.Find(id);
    Tariff tariff = new Tariff();
    tariff.X = holdingTariff.X;
    //repeat for all attributes

    return tariff;
}

チャームのように機能します。これが設計された動作であるかどうかはわかりません。多くのオブジェクトに対してこのパターンを繰り返す必要があるため、少し面倒ですが、少なくとも機能します。

うまくいけば、これは他の誰かを助けるでしょう!

于 2012-08-01T10:51:33.497 に答える