如何读取json文件并在自定义类中序列化?

时间:2012-11-28 16:22:09

标签: c# json servicestack file-handling

我在menu.json文件中保存了以下JSON:

       {
          "menu": {
                    "menuitems": [
                     {
                          "label": "Account",
                          "listview": "Account List"
                      },
                      {
                          "label": "Documents",
                          "listview": "Document List"
                      }
                                ]
                  }
       }

我已手动将此数据写入文件。我使用以下函数检索此数据:

        public ActionResult GetFromFile(string path)// path points to the menu.json file
       {
          StreamReader sr = new StreamReader(path);
          string filedata = sr.ReadToEnd();
          Menu menu = JsonSerializer.DeserializeToString<Menu>(filedata);
          return Json(menu, JsonRequestBehavior.Allowget);

       }

当我将响应作为菜单时,我无法在类字段中将其分开。而且,我有一个类,所以如何将我的json文件数据存储到这个类?课程结构会有任何修改吗?我的菜单类如下:

    public class Menu

    {
       public string Label {get;set;}
       public string Listview {get;set;}
   }

4 个答案:

答案 0 :(得分:1)

序列化在菜单上方有一个额外的,未命名的容器。您的类结构需要如下所示:

public class container
{
    public menu menu { get; set; }
}

public class menu
{
    public menuitem[] menuitems { get; set; }
}

public class menuitem
{
    public string Label { get; set; }
    public string Listview { get; set; }
}

要反序列化,您可以使用:

JavaScriptSerializer js = new JavaScriptSerializer();
StreamReader sr = new StreamReader("menu.json");
string filedata = sr.ReadToEnd();
var menus = js.Deserialize<container>(filedata);

答案 1 :(得分:0)

我认为您需要将Menu类重命名为MenuItem:

public class MenuItem
{
   public string Label { get; set; }
   public string Listview { get; set; }
}

创建一个新的Menu类,其中包含MenuItems列表:

public class Menu
{
    public List<MenuItem> MenuItems { get; set; }
}

看看是否有效。

答案 2 :(得分:0)

这里有一些序列化的例子http://james.newtonking.com/pages/json-net.aspx使用JSON.Net

答案 3 :(得分:0)

您的班级结构应与以下内容类似

public class Menu
    {
       public List<MenuItem> menuItems {get;set;}
   }

public class MenuItem
{
       public string Label {get;set;}
       public string Listview {get;set;}
}