2013-06-26 2 views
0

я выполнить запрос, который возвращает мне список заказов клиентов:Как получить список объектов в правильный формат JSON?

SELECT cust_no, cust_name, order_no, order_name FROM CustomerOrders 

В моем Controller Action методе я делаю следующее (_context это мой DataContext):

var results = _context.CustomerOrders.ToList(); 

return Json(results, JsonRequestBehavior.AllowGet); 

Когда я инспектировать это отладчик, я вижу список объектов, но не слишком хорошо знаком с Json, я не уверен, как это будет выглядеть, когда это как строка Json. Формат Я хочу это:

{ 
    "Customer": { 
     "cust_no": "123", 
     "cust_name": "john", 
     "Orders": [ 
      { 
       "order_no": "1", 
       "order_name": "order1" 
      }, 
      { 
       "order_no": "2", 
       "order_name": "order2" 
      } 
     ] 
    }, 
    "Customer": { 
     "cust_no": "456", 
     "cust_name": "jane", 
     "Orders": [ 
      { 
       "order_no": "3", 
       "order_name": "order3" 
      }, 
      { 
       "order_no": "4", 
       "order_name": "order4" 
      } 
     ] 
    } 
} 

В настоящее время я могу получить в этом:

{ Customer = "123", cust_name = "John", Orders = "1", oder_no = "order1" }

с:

_context.CustomerOrders.Select(x => new 
            { 
             Customer= x.cust_no, x.cust_name, 
             Orders = x.order_no, x.order_name}); 

public ActionResult GetCustomerOrders() 
    { 
     JsonResult result = null; 
     try 
     { 
      var results = new {Customers = _context.CustomerOrders.ToList()}; 

      return Json(results,JsonRequestBehavior.AllowGet); 
     } 
     catch (Exception ex) 
     { 
      //Log 
     } 

     return result; 
    } 

ответ

2

Вы не можете иметь JSON пар ключ-значение с тот же ключ на том же уровне вложенности (в вашем случае уровень 0). Если вы хотите, вы можете вернуть анонимный тип, делая что-то вроде:

var results = new {Customers = _context.CustomerOrders.ToList()}; 

ПРИМЕЧАНИЯ - Забыл добавить, что приведенный выше код будет выглядеть следующим образом:

{ 
    Customers: [{ 
     "cust_no": "123", 
      "cust_name": "john", 
      "Orders": [{ 
      "order_no": "1", 
       "order_name": "order1" 
     }, { 
      "order_no": "2", 
       "order_name": "order2" 
     }] 
    }, { 
     "cust_no": "456", 
      "cust_name": "jane", 
      "Orders": [{ 
      "order_no": "3", 
       "order_name": "order3" 
     }, { 
      "order_no": "4", 
       "order_name": "order4" 
     }] 
    }] 
} 

Проверьте спецификации для JSON здесь : http://www.json.org/

EDIT - (в ответ на фиксируя свой Linq запрос) Ниже то, что вам нужно:

var results = (from co in _context.CustomerOrders 
        group co by new { co.cust_no, co.cust_name } into orders 
        select new 
        { 
         Customer = new 
         { 
          cust_name = orders.Key.cust_name, 
          cust_no = orders.Key.cust_no, 
          Orders = orders.Select(o=> new{o.order_name,o.order_no }) 
         } 
        }).AsEnumerable(); 
    return Json(results, JsonRequestBehavior.AllowGet); 

Результаты с использованием фиктивных данных должен выглядеть следующим образом:

[{ 
    "Customer": { 
     "cust_name": "ted", 
     "cust_no": "1441865486", 
     "Orders": [{ 
      "order_name": "ted1271196444", 
      "order_no": "1877898370" 
     }, { 
      "order_name": "ted1137404580", 
      "order_no": "1033969821" 
     }, { 
      "order_name": "ted113580415", 
      "order_no": "844051358" 
     }, { 
      "order_name": "ted842422359", 
      "order_no": "1063097922" 
     }, { 
      "order_name": "ted2140579126", 
      "order_no": "1170215299" 
     }, { 
      "order_name": "ted843928549", 
      "order_no": "2143378901" 
     }] 
    } 
}, { 
    "Customer": { 
     "cust_name": "Jack", 
     "cust_no": "1258770771", 
     "Orders": [{ 
      "order_name": "Jack879867938", 
      "order_no": "585569719" 
     }, { 
      "order_name": "Jack1423388998", 
      "order_no": "209013154" 
     }] 
    } 
}, { 
    "Customer": { 
     "cust_name": "joe", 
     "cust_no": "1223478754", 
     "Orders": [{ 
      "order_name": "joe1283306017", 
      "order_no": "1305330220" 
     }, { 
      "order_name": "joe1369830458", 
      "order_no": "1996259538" 
     }, { 
      "order_name": "joe1772918032", 
      "order_no": "1265675292" 
     }, { 
      "order_name": "joe535974281", 
      "order_no": "837890619" 
     }, { 
      "order_name": "joe194556914", 
      "order_no": "812224857" 
     }, { 
      "order_name": "joe28812423", 
      "order_no": "515669909" 
     }, { 
      "order_name": "joe2004245093", 
      "order_no": "1634742463" 
     }] 
    } 
}, { 
    "Customer": { 
     "cust_name": "jill", 
     "cust_no": "659748358", 
     "Orders": [{ 
      "order_name": "jill1462582377", 
      "order_no": "1817173079" 
     }, { 
      "order_name": "jill1848627650", 
      "order_no": "830495643" 
     }, { 
      "order_name": "jill727215465", 
      "order_no": "728808273" 
     }, { 
      "order_name": "jill1071911623", 
      "order_no": "824043403" 
     }, { 
      "order_name": "jill126843849", 
      "order_no": "1654825240" 
     }] 
    } 
}] 
+0

Как вы проверяете, что строка JSON будет выглядеть? Когда я делаю: 'result = Json (new {Customers = _context.CustomerOrders.ToList()}, JsonRequestBehavior.AllowGet', я просто вижу список объектов, а не форматированную строку JSOn. – Xaisoft

+0

Я не вижу строку JSON в свойство Data, когда я вхожу в метод. Я просто вижу список объектов. Я отправлю свой полный метод. – Xaisoft

+0

@Xaisoft Вы можете увидеть строковое представление своего объекта, перейдя по URL-адресу действия вашего контроллера, которое возвращает JSON Я бы использовал Firefox или Chrome. Я * думаю * IE захочет, чтобы вы его загрузили, если вы перейдете на него. – mitch