2013-02-23 3 views
0

Je suis capable d'obtenir la sortie json suivante de mon contrôleur, mais je dois supprimer la "clé" & "valeur" de myDates & myStaff, et de regrouper les heures de rendez-vous par date - par exemple: date0 , date1, date2 ..MVC 4 Linq format json réponse

{ 
"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" 
     }] 
    ] 
}] 
} 

essentiellement, je dois faire le JSON formaté comme ci-dessous:

{ 
"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" 
     }] 
    ]} 
}] 
}] 
} 

Ceci est mon contrôleur:

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

    } 

Toute aide serait appréciée :)

Répondre

0

Essayez ceci:

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

Espérons que cela aidera !!

+0

Merci pour votre réponse, mais malheureusement, cela ne fonctionne pas comme il supprime tous les numéros de date (date0, date1.date2..etc) de MyDates & supprime tous les numéros de staff (staff0, staff1, staff2..etc) de myStaff car ceux-ci sont configurés comme les "Keys" .. Aussi besoin d'ajouter le day.DayOfWeek au myStaff json résultat. – MWD

+0

quel serait le problème à propos de la suppression des numéros des clés de date? Je veux dire sans ceux que vous venez d'avoir un tableau que vous pouvez voir en accédant à la date [0] date [1] ... etc – Ingo

0

Cela vous donnera pas un [] des articles, mais il est assez proche

... 

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

devrait donner un résultat comme:

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

Note: Cependant, vous devriez probablement faire un peu de refactoring pour arriver à un dictionnaire sans ces nombreuses étapes.

0

Vous pouvez convertir myDates en objet dynamic comme celui-ci (il est sur l'espace de noms System.Dynamic):

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

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

Et pour la partie de sérialisation, au lieu d'utiliser la valeur par défaut JSON sérialiseur, essayez d'utiliser this serializer (il a également disponible via NuGet), quelque chose comme ceci:

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

Vous pouvez faire les étapes similaires pour la partie myStaff, il produira le résultat ex piqué.