将对象名称添加到其序列化字符串

时间:2012-01-17 17:08:33

标签: c# json.net

假设我有这个对象:

[JsonObject]
public class User
{
    [JsonProperty(PropertyName = "id")]
    public string Id { get; set; }

    [JsonProperty(PropertyName = "name")]
    public string Name { get; set; }

    [JsonProperty(PropertyName = "birthday")]
    public DateTime Birthday { get; set; }
}

这将产生这样的JSON:

{
   "id":null,
   "name":"Bob",
   "birthday":"/Date(374479200000-0600)/"
}

我正在寻找一种方法来为所有这些添加类名,例如:

{
   "user":{
      "id":null,
      "name":"Bob",
      "birthday":"/Date(374479200000-0600)/"
   }
}

JSON.NET有办法做到这一点吗?谢谢!

修改

我这样做的原因是将.NET客户端连接到Rails Web服务。 Rails将模型的属性放在命名空间下,所以我一直在寻找.NET符合这一要求的方法。

但是,在阅读了一些关于Backbone.js之后,看起来可能的替代方法是在Rails中禁用此行为:

  

如果您正在使用Rails后端,您会注意到Rails'   默认的to_json实现包括a下的模型属性   命名空间。要禁用此行为以实现无缝的Backbone集成,   设置:

     

ActiveRecord :: Base.include_root_in_json = false

2 个答案:

答案 0 :(得分:2)

如果你只想为root对象做这件事,我认为最简单的方法就是以一种方式将对象封装起来,以便按照你想要的方式进行序列化:

static object AddTypeName(object o)
{
    return new Dictionary<string, object> 
    {
        { o.GetType().Name.ToLowerInvariant(), o }
    };
}

答案 1 :(得分:2)

我使用JavaScriptSerializer.Serialize(Object)

亲自实现了这一目标
JavaScriptSerializer javaScriptSerializer = new JavascriptSerializer();
javaScriptSerializer.Serialize( new { user = userObject } );

这应该会自动反序列化以下类:

class User 
{ 
    string id;
    int age;
}

进入这个:

{
    user : {
        id = '12321345',
        age = 32
    }
}