Problem:
Bei Auswerten einer Api Schnittstelle, welche eine reine Werte-Liste zurückgibt, kommt der Fehler dass die Methode zu eine unerwarteten Zeitpunkt aufgerufen wurde.
Lösung:
Beim Auswerten von Json Rückgaben werden die Rückgabewerte mit integrierten Datenmodellen mit JsonObjekt auswertet.
Wenn es sich um reine Strings oder Zahlen handelt, dann muss man die Werte mit getNumber() auswerten.
Json Fehler:
System.InvalidOperationException HResult=0x8000000E Message= Eine Methode wurde zu einem unerwarteten Zeitpunkt aufgerufen. Dies ist kein Objektwert. Verwenden Sie die ValueType-Eigenschaft zum Abrufen des Typs. Source=Windows.Data StackTrace: at Windows.Data.Json.JsonValue.GetObject() .. |
Fehler bei der Umwandlung
Es kommen reine Zahlenwerte vom Typ Long an.
JsonObject jsonObject = jsonRow.GetObject(); |
Name |
Value |
Type |
|
▶ |
jsonArray |
{[10073,10072,10071,10070,10069,10068,10067,10066,10065,10064,10063]} |
Windows.Data.Json.JsonArray |
▶ |
jsonRow |
{10073} |
Windows.Data.Json.IJsonValue {Windows.Data.Json.JsonValue} |
jsonRow.GetNumber() |
10073 |
double |
Die Umwandlung von einer Asp api mit der Rückgabe eines Datenmodels wurde bisher wie dieser Code umgewandelt.
Dabei wird das Datenmodel in ein JsonObjekt gelesen und der einzelen Feldwert mit jsonObject["Feld"].ToString() umgewandelt
JsonObject jsonObject = jsonRow.GetObject();
//< values > string sID_on_Server = jsonObject["idProject"].ToString(); //</ values >
long ID_on_Server = 0; try { ID_on_Server = Convert.ToInt64(sID_on_Server); } catch { } |
Lösung Code
Im neuen Code wird der Wert direkt als Double von der Json-Variable ausgelesen mit .GetNumber()
double dblValue = jsonRow.GetNumber(); long ID_on_Server = Convert.ToInt64( dblValue); |
Api auf der Serverseite:
Auf der Asp.Net Core MVC WebApi Seite wird eine Liste mit long Werten zurückgeben.
Ohne Datenmodell sondern nur Zahlenreihen.
List<long> dataList = query.ToList(); |
// GET: /api/index public async Task<List<long>> Index() { //-------------< Index >------------- //< get UserClaim Info > //*get User from Token var userClaim_in_Token = HttpContext.User.Claims.Where(c => c.Type == ClaimsIdentity.DefaultNameClaimType).FirstOrDefault(); //User as Name if(userClaim_in_Token==null) { return null; } string sEmail = userClaim_in_Token.Value; //</ get UserClaim Info >
//< check user > long IDCurrent_User = await Get_UserID(sEmail); if (IDCurrent_User == 0) { return null; } //</ check user >
//--< Get Linq.Query >-- //*gets last 10 Projects with View_Sum var query = (from project in _dbContext.tbl_Projects where project.IDOwner == IDCurrent_User orderby project.IDProject descending select project.IDProject).Take(3000); //--</ Get Linq.Query >--
//----< fill Data_to_View >---- List<long> dataList = query.ToList();
//< out > //*output to client return dataList; //</ out > //-------------</ Index >------------- } |