19

long as ID を使用するカスタムメイドのクラスがあります。ただし、ajax を使用してアクションを呼び出すと、ID が切り捨てられ、最後の 2 つの数字が失われます。これは、JavaScript が大きな数を処理するときに精度を失うためです。私の解決策は、JavaScript に文字列を与えることですが、ID はサーバー側で長く保持する必要があります。

プロパティを文字列としてシリアル化する方法はありますか? ある種の属性を探しています。

コントローラ

public class CustomersController : ApiController
{
   public IEnumerable<CustomerEntity> Get()
   {
      yield return new CustomerEntity() { ID = 1306270928525862486, Name = "Test" };
   }
}

モデル

public class CustomerEntity
{
   public long ID { get; set; }
   public string Name { get; set; }
}

JSON 結果

[{"Name":"Test","ID":1306270928525862400}]
4

5 に答える 5

2

次のように、プロパティview modelのみを持つ はどうでしょうか。string

public class CustomerEntityViewModel
{
    public string ID { get; set; }
    public string Name { get; set; }
}

stringこれで、 sのみを扱うようになり、JSONシリアライゼーションの問題は解消されました。

于 2013-06-28T16:27:15.230 に答える
2

jsonシリアライザーを次のように呼び出すときに、おそらく匿名型を作成するだけです。

 JsonConvert.SerializeObject(new { instance.Name, instance.ID.ToString() } );

クラスに 20 か何かのフィールドがあり、これが非常に醜い解決策になる場合、 というクラスに文字列を追加しID、 long を に変更し、lIDシリアライザーの設定を使用してシリアライズ時に long を無視し、結果の json が文字列バージョンのみがあります。

たとえば、これを実現するいくつかの異なる属性があります。

 public class CustomerEntity
 {
      [ScriptIgnore]
      public long _ID { get; set; }
      public string ID { get; set; }
      public string Name { get; set; }
 }

シリーズ化しません_ID

于 2013-06-28T16:28:24.327 に答える
0

おそらく実行可能な回避策は、ID に別のタイプを使用することでしょうか? たとえば、GUID を使用できます。GUID を使用すると、範囲外になることはありません。また、これはデフォルトで文字列としてシリアル化されると思います。

于 2013-06-28T16:31:54.180 に答える