json 反序列化 returns 空

json deserialization returns null

我将带有 ajax 表单数据的 JSON 对象传递给控制器​​。我尝试将它反序列化为对象,但它总是 returns null。我只能将其转换为动态,但无法将动态转换为类别 class。

public class CategoryVM
{
    public Category category { get; set; }
    public CategoryImage categoryImage { get; set; }

    public CategoryVM()
    {
        category = new Category(); 
        categoryImage = new CategoryImage(); 
    }
}

类别class

public class Category
{
    public string Kategori { get; set; }
    public string Kodu { get; set; }
    public bool State { get; set; }
}

JSON 值:

{
    "cat": {
        "Category": {
            "Kategori": "xxx",
            "Kodu": "yyy",
            "State": "true"
        }
    }
}

控制器:

[HttpPost]
public ActionResult AddCat(string cat)
{
     dynamic json = Newtonsoft.Json.JsonConvert.DeserializeObject(cat);
     CategoryVM c = JsonConvert.DeserializeObject<CategoryVM >(JsonConvert.SerializeObject(json)); //converts null here
     return View();
}

我也试过 JsonConvert,但对我不起作用:

CategoryVM c = JsonConvert.DeserializeObject<CategoryVM>(JsonConvert.SerializeObject(json));

您有一个额外的嵌套级别 {"cat": { /* CategoryVM contents */ }},但未反映在您的数据模型中。解决这个问题的最简单方法是反序列化为带有 public CategoryVM cat 属性 的包装器对象,它可以是 anonymous type object:

var c = JsonConvert.DeserializeAnonymousType(cat, new { cat = default(CategoryVM) })
    .cat.category;

演示 fiddle here.

你可以这样做,那么你就不需要CategoryVM:

var obj = JsonConvert.DeserializeObject<JObject>(json);
var category = JsonConvert.DeserializeObject<Category>(obj.First.First["Category"].ToString());