在MVC中反序列化未命名对象

本文关键字:未命名 对象 反序列化 MVC | 更新日期: 2023-09-27 18:05:12

我有以下被认为有效的JSON:

{
    "folderList": [
        [
            {
                "folderPath": "/Test",
                "userList": [
                    {
                        "userName": "Test User",
                        "accessType": "Read Only",
                        "startDate": "2.May.2014",
                        "endDate": "3.May.2014"
                    }
                ]
            }
        ]
    ]
}

问题是,你可以看到,文件夹列表包含一个数组,没有名字,所以我无法让它在MVC中正确反序列化。它正在提取当前项目的数量(在本例中为1),但所有值最终都为空。

任何想法?

在MVC中反序列化未命名对象

它是一个包含列表的列表(或者是一个包含数组的数组,如果你喜欢的话)。

// Users that got access to a specific folder item
public class User
{
    public string userName {get; set; }
    public string accessType{get; set; }
    public string startDate {get; set; }
    public string endDate {get; set; }
}
// Inner object
public class FolderListItem
{
    public string folderPath { get; set; }
    public User[] userList { get; set; }
}
// See? List of Lists
public class RootObject
{
    public List<List<FolderListItem>> folderList { get; set; }
}
// Need to have a root object as the folder list is named.
public ActionResult SomeMethod(RootObject data)
{
}

看看这个答案。

https://stackoverflow.com/a/3806407/992021

我过去使用过它,并且能够解决我无法控制所接收的JSON有效负载的问题。

否则,实现这一目标的方法之一是通过使用JSON反序列化器的解决方案。当您只需要JSON有效负载中的值,而不能或不想创建要反序列化到的实际对象时,这非常有用。JSON.net

dynamic jsonObject = JsonConvert.DeserializeObject("{ 'Name': 'Jon Smith', 'Address': {         'City': 'New York', 'State': 'NY' }, 'Age': 42 }");
string name = jsonObject.Name;
string address = jsonObject.Address.City;

也使用Newtonsoft.Json.Linq:

dynamic jsonObject = JObject.Parse("{ 'Name': 'Jon Smith', 'Address': { 'City': 'New York', 'State': 'NY' }, 'Age': 42 }");
string name = jsonObject.Name;
string address = jsonObject.Address.City;

你必须创建像

这样的类
public class Folder
{
 public string folderPath{get;set;}
 public List<USER> userList{get;set;}
}
public class USER
{
public string userName{get;set;}
public string accessType{get;set;}
public string startDate{get;set;}
public string endDate{get;set;}
}