【问题标题】:JavaScriptSerializer Serialize for Nested Object in c#JavaScriptSerializer 为 c# 中的嵌套对象序列化
【发布时间】:2015-01-15 02:41:26
【问题描述】:

我已经为多级菜单创建了类。它运作良好。但现在我希望 Menu 类转换为 JSON 对象以便在 angularjs 中使用。

我有二班

class Menu
{
    private List<Item> Items = new List<Item>();
}

class Item
{
    public int Id { get; set; }
    public int Level { get; set; }
    public string Title { get; set; }
    public string NavigateUrl { get; set; }
    public Menu Child { get; set; }
}`

我需要创建菜单的 JSON 对象,其中菜单类包含项目列表,项目类包含菜单。

JavaScriptSerializer.Serialize 只使用一个级别。 我是否必须实现任何类型的接口或更改可以序列化的类?

【问题讨论】:

  • 我们可以看看你用来返回 JSON 的方法吗?

标签: c# .net json


【解决方案1】:

您的主要问题似乎是您的 Menu 类有一个内部私有变量,该变量保存 Item 对象的列表,而外部代码无法访问该列表。

Javascript 序列化器只能序列化类的公共属性。

如果您使用属性 getter 使您的菜单项可公开访问...类似这样:

class Menu
{
    private List<Item> _items = new List<Item>();

    public List<Item> Items
    {
        get { return _items; }
        set { _items = value; }
    }
}

它应该可以工作。

您的 Item 类已经由公共属性组成,因此应该可以毫无问题地进行序列化。

【讨论】:

  • 谢谢。我没有意识到我将我的 Items 变量保密。虽然我这样做是出于其他原因。
【解决方案2】:

如果我理解你的问题,你需要做的下一步:

[DataContract]
public class Menu
{
    [DataMember]
    private List<Item> Items = new List<Item>();
}

[DataContract]
public class Item
{
    [DataMember]
    public int Id { get; set; }

    [DataMember]
    public int Level { get; set; }

    [DataMember]
    public string Title { get; set; }

    [DataMember]
    public string NavigateUrl { get; set; }

    [DataMember]
    public Menu Child { get; set; }
}

然后你可以使用:

var menu = new Menu(); 
/* add items */ 
var serializer = new JavaScriptSerializer(); 
var serializedResult = serializer.Serialize(menu);

如果我在某处错了,请纠正我

【讨论】:

  • 我也试过你的代码。但是对于私有变量它不起作用。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-01-28
  • 2016-12-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多