2010-02-05 84 views
5

我控制器JSON格式类似这样的压扁了MVC结合

return Json(customer); 

返回一个对象图表视图在我的JSON对象看起来像这样

{ 
    Name: 'Joe', 
    Budget: { Amount: 500, Spend: 100 } 
} 

认为一个复杂的JSON对象,正确映射到我的客户对象:

public class Customer 
{ 
    public string Name {get;set;} 
    public Budget Budget{get;set;} 
} 

public class Budget 
{ 
    public decimal Amount{get;set;}  
    public decimal Spend{get;set;} 
} 

我想通过相同的JSON对象回anoth

public ActionResult Method(Customer customer) 

当我做这个客户的名字将会被填充,但不是预算类,我明白为什么,因为ModelBinder的期待是::{名称:“乔”,“预算与此签名的控制器上ER方法.Amount':500,'Budget.Spend':100}

所以我必须选择: 1.我可以按照它想要的格式返回json对象,但是我不知道如何,因为你可以'吨做到这一点:

return Json(new { Budget.Amount= 500}) 
  • 我可以在客户端压扁json对象。有插件或方法来做到这一点?
  • +0

    但你可以做到这一点,对吧?不知道这是否解决了您的整个问题: return Json(new {Budget = new {Amount = 500}}) – RationalGeek 2010-02-05 21:43:09

    +0

    我在尝试扁平化json对象,以便结果为'{'Budget.Amount'= 500}' – adriaanp 2010-02-05 21:47:29

    回答

    5

    下面是一个对象转换为平散

    function flatten(json){ 
        var nj = {}, 
         walk = function(j){ 
          var jp; 
          for(var prop in j){ 
           jp = j[prop]; 
           if(jp.toString() === "[object Object]"){ 
            walk(jp); 
           }else{ 
            nj[prop] = jp; 
           } 
          } 
         }; 
        walk(json); 
        return nj; 
    } 
    
    +0

    哦,不,你想把json变成哈希? – Mic 2010-02-05 22:03:13

    +1

    是的,它有什么问题吗?不好的做法? – adriaanp 2010-02-05 22:30:37

    +0

    您的解决方案将工作,但我将需要有'Budget.Amount'作为属性名称,我目前正在通过将前缀变量传递给'走'功能 – adriaanp 2010-02-05 22:33:19

    0

    在我的情况下,我们通过传递更多的物体的动作网址解决了它的功能。

    公众的ActionResult方法(客户的客户,[绑定(PREFIX =“预算”)预算预算)

    要做到这一点,你必须扁平化JSON数据以下列方式(你送了它之前,控制器) :

    How to pass complex type using json to ASP.NET MVC controller