Json Fehler: Eine Methode wurde zu einem unerwarteten
Zeitpunkt aufgerufen
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=
A method was started at an unexpected time
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 >-------------
}
|