2013-02-23 4 views
0

Я могу получить следующий вывод json от моего контроллера, но мне нужно удалить «ключ» & «значение» из myDates & myStaff и сгруппировать время встречи по дате - например: date0 , date1, date2 ..MVC 4 Linq format json response

{ 
"myDates": [{ 
    "Key": "date0", 
    "Value": "23/02/2013" 
}, { 
    "Key": "date1", 
    "Value": "24/02/2013" 
}, { 
    "Key": "date2", 
    "Value": "25/02/2013" 
}, { 
    "Key": "date3", 
    "Value": "26/02/2013" 
}, { 
    "Key": "date4", 
    "Value": "27/02/2013" 
}, { 
    "Key": "date5", 
    "Value": "28/02/2013" 
}, { 
    "Key": "date6", 
    "Value": "1/03/2013" 
}, { 
    "Key": "dname0", 
    "Value": "Saturday" 
}, { 
    "Key": "dname1", 
    "Value": "Sunday" 
}, { 
    "Key": "dname2", 
    "Value": "Monday" 
}, { 
    "Key": "dname3", 
    "Value": "Tuesday" 
}, { 
    "Key": "dname4", 
    "Value": "Wednesday" 
}, { 
    "Key": "dname5", 
    "Value": "Thursday" 
}, { 
    "Key": "dname6", 
    "Value": "Friday" 
}, { 
    "Key": "ndate", 
    "Value": "2013-03-02" 
}, { 
    "Key": "pdate", 
    "Value": "2013-02-16" 
}], 
"myStaff": [{ 
    "Key": "staff0", 
    "Value": [ 
     [{ 
      "SlotID": 42501, 
      "StaffID": 1, 
      "BusinessID": 1, 
      "SlotDate": "23/02/2013", 
      "SlotDay": "Saturday", 
      "SlotTime": "10:00" 
     }, { 
      "SlotID": 42502, 
      "StaffID": 1, 
      "BusinessID": 1, 
      "SlotDate": "23/02/2013", 
      "SlotDay": "Saturday", 
      "SlotTime": "10:30" 
     }], 
     [{ 
      "SlotID": 47001, 
      "StaffID": 1, 
      "BusinessID": 1, 
      "SlotDate": "24/02/2013", 
      "SlotDay": "Sunday", 
      "SlotTime": "10:00" 
     }, { 
      "SlotID": 47002, 
      "StaffID": 1, 
      "BusinessID": 1, 
      "SlotDate": "24/02/2013", 
      "SlotDay": "Sunday", 
      "SlotTime": "10:30" 
     }] 
    ] 
}] 
} 

в основном, мне нужно, чтобы получить JSON отформатирован, как показано ниже:

{ 
"myDates": [{ 
    "date0": "23/02/2013", 
    "date1": "24/02/2013", 
    "date2": "25/02/2013", 
    "date3": "26/02/2013", 
    "date4": "27/02/2013", 
    "date5": "28/02/2013", 
    "date6": "1/03/2013", 
    "dname0": "Saturday", 
    "dname1": "Sunday", 
    "dname2": "Monday", 
    "dname3": "Tuesday", 
    "dname4": "Wednesday", 
    "dname5": "Thursday", 
    "dname6": "Friday", 
    "ndate": "2013-03-02", 
    "pdate": "2013-02-16", 
}], 
"myStaff": [{ 
    "staff0": {[ 
     "date0": {[ 
     [{ 
      "SlotID": 42501, 
      "StaffID": 1, 
      "BusinessID": 1, 
      "SlotDate": "23/02/2013", 
      "SlotDay": "Saturday", 
      "SlotTime": "10:00" 
     }, { 
      "SlotID": 42502, 
      "StaffID": 1, 
      "BusinessID": 1, 
      "SlotDate": "23/02/2013", 
      "SlotDay": "Saturday", 
      "SlotTime": "10:30" 
     }], 
     "date1": {[ 
      "SlotID": 47001, 
      "StaffID": 1, 
      "BusinessID": 1, 
      "SlotDate": "24/02/2013", 
      "SlotDay": "Sunday", 
      "SlotTime": "10:00" 
     }, { 
      "SlotID": 47002, 
      "StaffID": 1, 
      "BusinessID": 1, 
      "SlotDate": "24/02/2013", 
      "SlotDay": "Sunday", 
      "SlotTime": "10:30" 
     }] 
    ]} 
}] 
}] 
} 

Это мой контроллер:

 public ActionResult Index(DateTime start, string id = null) 
    { 

     var allids = Request.QueryString["id"]; 

     // split the input into anonymous objects containing staffid and businessid 
     var staffids = from staffid in allids.Split(',').Select(x => x.Split('-')) 
      select new { sid = int.Parse(staffid[0]), bid = int.Parse(staffid[1]) }; 

     // get the days you need 
     var days = Enumerable.Range(0, 7).Select(x => start.AddDays(x)); 

     // create myDates 
     int i = 0; 
     var myDates = (from day in days 
         select new KeyValuePair<string, string>(
          String.Format("date{0}", i++), 
          day.ToShortDateString())).ToList(); 
     i = 0; 
     myDates.AddRange(
         (from day in days 
         select new KeyValuePair<string, string>(
          String.Format("dname{0}", i++), 
          day.DayOfWeek.ToString())).ToList()); 
     myDates.Add(new KeyValuePair<string, string>("ndate", days.First().AddDays(7).ToString("yyyy-MM-dd"))); 
     myDates.Add(new KeyValuePair<string, string>("pdate", days.First().AddDays(-7).ToString("yyyy-MM-dd"))); 

     // receive all the stored_procedures 
     i = 0; 
     var myStaff = from staff in staffids 
         select new KeyValuePair<string, object>(
         String.Format("staff{0}", i++), 
         (from day in days 
          select db.Database.SqlQuery<GetAvailableAppointments>("EXEC SP_GetAvailableAppointments @StaffID, @BusinessID, @StartDate", 
          new SqlParameter("StaffID", staff.sid), 
          new SqlParameter("BusinessID", staff.bid), 
          new SqlParameter("StartDate", day))).ToList() 
        ); 

     return Json(new { myDates, myStaff }, JsonRequestBehavior.AllowGet); 

    } 

Любой помощь будет оценен :)

ответ

0

Попробуйте вместо этого:

return Json(new { 
        myDates.Select(D => D.Value), 
        myStaff.Select(S => S.Value) 
       }, JsonRequestBehavior.AllowGet); 

Надеется, что это поможет !!

+0

Спасибо за ваш ответ, но, к сожалению, не работает, как он удаляет все цифры даты (date0, date1.date2..etc) из MyDates & удаляет все номера сотрудников (staff0, staff1, staff2..etc) из myStaff, поскольку они настроены как «Ключи». Также необходимо добавить day.DayOfWeek в myStaff json результат. – MWD

+0

Какова будет проблема с удалением чисел из ключей даты? я имею в виду без них, у вас просто есть Array, с которым вы можете пройти доступ к дате [0] date [1] ... и т. д. – Ingo

0

Это обыкновение давать вам [] пунктов, но это довольно близко

... 

var dictionary = myDates.ToDictionary(x => x.Key, x => x.Value); 
return Json(new { myDates = dictionary, myStaff }, JsonRequestBehavior.AllowGet); 

должен дать результат, как:

{ 
    "myDates": { 
     "date0": "2013-02-23", 
     "date1": "2013-02-24", 
     "date2": "2013-02-25", 
     "date3": "2013-02-26", 
     ... 
    }, 
    "myStaff": {...} 
} 

Примечание: Однако вы, вероятно, следует сделать некоторые рефакторинга, чтобы добраться до словарь без этих шагов.

0

Вы можете попробовать преобразовать myDates в dynamic объект, как это (это на System.Dynamic имен):

dynamic myDynamicDates = new ExpandoObject(); 
var d = myDynamicDates as IDictionary<string, object>; 

foreach (var myDate in myDates) 
{ 
    d[myDate.Key] = myDate.Value; 
} 

И для сериализации части, вместо того, чтобы использовать JSON сериализатор по умолчанию, попробуйте использовать this serializer (это также доступны через NuGet), что-то вроде этого:

return Content(JsonConvert.SerializeObject(new { myDates = new []{ myDynamicDates } }), "application/json"); 

Вы можете сделать аналогичные шаги для myStaff части, поэтому он будет производить результат экс pected.

0

Имена ключей и значений, которые вы используете с помощью этого решения, исходят от использования KeyValuePairs. Чтобы избежать этого, вы должны написать свои собственные модели данных, у которых есть свойства, названные в честь Json-Keys, которые вы ожидаете. Для того, чтобы увидеть, что я имею в виду, посмотрите на мой обновленный ответ на ваш соответствующий вопрос на

MVC 4 controler - using dynamic StaffID's & BusinessID's instead of hard coded ones