2010-02-05 16 views
5

Mi controlador devuelve un gráfico de objetos a la vista en formato JSON como estoEl aplanamiento de un objeto JSON compleja para la unión

return Json(customer); 

En la vista de mi objeto JSON se parece a esto

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

MVC ¿Qué mapea correctamente a mi objeto del cliente:

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;} 
} 

Quiero pasar el mismo objeto json de nuevo a anoth Método er en el controlador con esta firma:

public ActionResult Method(Customer customer) 

Cuando hago el nombre de este cliente obtener poblada pero no la clase económica, que entiendo por qué, porque la modelbinder se esperaba esto: {Nombre: 'Joe', 'Presupuesto .Amount ': 500,' Budget.Spend ': 100}

Así que tengo que opciones: 1. Puedo devolver el objeto json en el formato que quiere, pero no sé cómo porque puede' t hacer esto:

return Json(new { Budget.Amount= 500}) 
  1. Puedo aplanar el objeto JSON en el lado del cliente. ¿Hay complementos o métodos para hacer esto?
+0

pero puede hacerlo, ¿no? no estoy seguro si esto resuelve tu problema completo: return Json (nuevo {Budget = new {Amount = 500}}) – RationalGeek

+0

Estoy tratando de aplanar el objeto json para que el resultado sea '{' Budget.Amount '= 500}' – adriaanp

Respuesta

5

Aquí es una función que convierte un objeto en un hash plana

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

Oh no ... ¿quieres aplanar el json en un hash? – Mic

+1

sí, ¿hay algún problema con eso? ¿Mala práctica? – adriaanp

+0

su solución funcionará, pero necesitaré tener 'Budget.Amount' como el nombre de la propiedad, actualmente lo estoy haciendo pasando una variable de prefijo a la función 'caminar' – adriaanp

0

En mi caso se ha resuelto mediante el paso objeto adicional de la url acción.

pública ActionResult Método (Customercustomer, [bind (prefix = "Presupuesto")] Presupuesto)

para que esto suceda hay que aplanar los datos JSON (antes de que lo envió al controlador) en la forma siguiente :

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

Cuestiones relacionadas