【问题标题】:ASP.NET MVC: Can I get Json() to make use of an object's implicit string operator?ASP.NET MVC:我可以让 Json() 使用对象的隐式字符串运算符吗?
【发布时间】:2011-04-30 20:00:06
【问题描述】:

我有一个自定义类型,它具有如下隐式字符串运算符(简化):

public class TransactionType
{
    private string StringValue;

    public static implicit operator string(TransactionType arg)
    {
        return arg.StringValue;
    }

    public override string ToString() // This doesn't work, even when
    {                                 // returning an arbitrary constant string
        return arg.StringValue;       // such as "Testing"
    }
}

我试图返回一个 JsonResult 如下:

[HttpPost]
public JsonResult Foo()
{
   var transactionType = new TransactionType();
   return Json(transactionType); 
}

我得到的 JSON 字符串是 "TransactionType":{} 而不是 StringValue 的值

有没有简单的方法让 Json() 使用隐式字符串操作符?

谢谢!

编辑:如下所示,覆盖ToString() 也不起作用。我仍然只是得到一个空对象 "TransactionType":{} 而不是对象的字符串表示形式。

【问题讨论】:

    标签: asp.net-mvc json serialization


    【解决方案1】:

    ToString 是几乎在任何地方都被调用以获取字符串表示形式的方法。

    您应该在类中覆盖ToString,而不是使用隐式字符串运算符。

    【讨论】:

    • 我不得不取消选择这个答案,因为它看起来不像 ToString() 被调用。我覆盖了 ToString() 但它仍被序列化为“事务类型”:{}
    • 我刚刚添加了公共覆盖字符串 ToS​​tring(),但似乎没有调用该方法,因为我仍然得到相同的“空对象”JSON 字符串。感谢您顺便回复!
    【解决方案2】:

    覆盖ToString 而不是定义您自己的字符串运算符。或者两者都做。让一个打电话给另一个。

    【讨论】:

      【解决方案3】:

      通常,您希望它序列化为具有属性和值的对象,尽管我想您可以简单地返回一个字符串。如果您要返回一个字符串,则不需要 JSON,您可以使用 html 或文本 - 两者都可以(return Content( transactionType.ToString() );)如果您确实需要 JSON,那么我建议只需使用属性设置对象.

      public class TransactionType
      {
          public string Value { get; set; }
      } 
      

      然后你可以完全按照你的想法去做:

      [HttpPost]
      public JsonResult Foo()
      {
         var transactionType = new TransactionType { Value = "foo" };
         return Json(transactionType); 
      }
      

      这将序列化为{ "Value" : "foo" }

      注意,从 MVC3 开始,JsonResult 仍然使用 JavaScriptSerializer。如果属性需要私有,您可以使用 DataContractJsonSerializer,将属性标记为 DataMember(即使私有),序列化结果,然后使用 ContentResult 返回该字符串,但 MIME 类型为“application/json”。

      public class TransactionType
      {
          public TransactionType( string type )
          {
              Value = type;
          }
      
          [DataMember]
          private string Value { get; set; }
          ...
      } 
      

      然后你可以(在改变返回类型之后),创建一个方法来做序列化 并返回类似于 Json() 方法的内容结果。

      [HttpPost]
      public ActionResult Foo()
      {
         var transactionType = new TransactionType( "foo" );
         return DataContractJson(transactionType); 
      }
      
      private ActionResult DataContractJson<T>( T obj ) where T : class
      {
           using (var stream = new MemoryStream())
           {
               var serializer = new DataContractJsonSerializer(typeof(T));
               serializer.WriteObject( stream, obj );
               var content = Encoding.UTF8.GetString( stream.ToArray() );
               return Content( content, "application/json" );
           }
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-01-23
        • 2012-09-25
        • 1970-01-01
        • 1970-01-01
        • 2020-11-28
        • 1970-01-01
        相关资源
        最近更新 更多