JavaScriptSerializer 和 ValueTypes (struct)

Posted

技术标签:

【中文标题】JavaScriptSerializer 和 ValueTypes (struct)【英文标题】:JavaScriptSerializer and ValueTypes (struct) 【发布时间】:2011-07-02 19:09:26 【问题描述】:

对于一个项目,我在 C# 中创建了几个结构。 probject 本身是一个 ASP.Net MVC 2 项目。

截图:

struct TDummy

    private char _value;

    public TDummy(char value)
    
         this._value = value; // Restrictions
    

我创建这个是因为我需要将 char 变量限制为特定数量的值。 (我本可以创建一个 Enum,但是这些值也在数据库中使用,然后我仍然需要转换它们)

现在我需要创建一个 JsonResult,比如

return Json(new  Value = new TDummy('X') );

但是当我这样做时,我得到的结果是:

"Value":

我希望得到结果

"Value":"X"

我尝试了几种方法,例如 TypeConverter (CanConvertTo(string))、自定义类型序列化器 (javascriptSerializer.RegisterConverters()),但它们要么不起作用,要么必须返回“复杂”json 对象。

"Value":"Name":"Value"

对此有什么想法吗? 我想将值类型序列化为值...

【问题讨论】:

【参考方案1】:

如果有人感兴趣,我创建了一个小演示(控制台应用程序)来说明这一点:

public struct TState

   public static TState Active = new TState('A');
   public static TState Pending = new TState('P');

   private char _value;

   public TState(char value)
   
      switch (value)
      
         case 'A':
         case 'P':
            this._value = value;  // Known values
            break;
         default:
            this._value = 'A';    // Default value
            break;
      
   

   public static implicit operator TState(char value)
   
      switch (value)
      
         case 'A':
            return TState.Active;
         case 'P':
            return TState.Pending;
      
      throw new InvalidCastException();
   

   public static implicit operator char(TState value)
   
      return value._value;
   

   public override string ToString()
   
      return this._value.ToString();
   


public class Test  public TState Value  get; set;  

class Program

   static void Main(string[] args)
   
      Test o = new Test();
      o.Value = 'P';               // From Char
      char c = o.Value;            // To Char
      Console.WriteLine(o.Value);  // Writes 'P'
      Console.WriteLine(c);        // Writes 'P'

      JavaScriptSerializer jser = new JavaScriptSerializer();
      Console.WriteLine(jser.Serialize(o));  // Writes '"Value":'

      Console.ReadLine();
   

【讨论】:

以上是关于JavaScriptSerializer 和 ValueTypes (struct)的主要内容,如果未能解决你的问题,请参考以下文章

JavaScriptSerializer 和 ValueTypes (struct)

使用 LINQ/JavaScriptSerializer 创建 JSON 对象而不是数组

JavaScriptSerializer类 对象序列化为JSON,JSON反序列化为对象

C#中用JavaScriptSerializer和Json.Net操作json格式的文件

JavaScriptSerializer UTC DateTime 问题

JavaScriptSerializer.Deserialize - 如何更改字段名称