'Newtonsoft.Json.JsonSerializationException Message=Cannot deserialize the current JSON object
here the ex
Newtonsoft.Json.JsonSerializationException
Message=Cannot deserialize the current JSON object (e.g. {"name":"value"}) into type 'System.Collections.Generic.List`1[CCSN.Models.Patient]' because the type requires a JSON array (e.g. [1,2,3]) to deserialize correctly.
To fix this error either change the JSON to a JSON array (e.g. [1,2,3]) or change the deserialized type so that it is a normal .NET type (e.g. not a primitive type like integer, not a collection type like an array or List<T>) that can be deserialized from a JSON object. JsonObjectAttribute can also be added to the type to force it to deserialize from a JSON object.
Path '0', line 1, position 5.
in this line to get patient
return JsonConvert.DeserializeObject<TEntity>(json);
public static async Task<TEntity> Get<TEntity>(string url)
{
HttpClientHandler clientHandler = new HttpClientHandler();
clientHandler.ServerCertificateCustomValidationCallback = (sender, cert, chain, sslPolicyErrors) => { return true; };
HttpClient client = new HttpClient(clientHandler);
var response = await client.GetAsync(url);
var json = await response.Content.ReadAsStringAsync();
return JsonConvert.DeserializeObject<TEntity>(json);
}
is the error from not converting?
and how can i convert to object or json
this is the service to get Patient
public static async Task<IEnumerable<Patient>> GetUserPatients()
{
var url = await firebaseClient
.Child($"Specalists/406707265/Patients").BuildUrlAsync();
var result = await Helper.Get<List<Patient>>(url);
return result ;
}
Changed the Get type, to try to match the json
public static async Task<IEnumerable<Patient>> GetUserPatients()
{
var url = await firebaseClient
.Child($"Specalists/406707265/Patients").BuildUrlAsync();
var patientsDict = await Helper.Get<Dictionary<string, Patient>>(url);
var result = patientsDict.Values.ToList();
return result ;
}
Solution 1:[1]
The back and forth in comments has gotten unwieldy. Here is a community wiki showing the status of resolving this.
Exception:
Newtonsoft.Json.JsonSerializationException
Message=Cannot deserialize the current JSON object (e.g. {"name":"value"}) into type 'System.Collections.Generic.List`1[CCSN.Models.Patient]' because the type requires a JSON array (e.g. [1,2,3]) to deserialize correctly.
To fix this error either change the JSON to a JSON array (e.g. [1,2,3]) or change the deserialized type so that it is a normal .NET type (e.g. not a primitive type like integer, not a collection type like an array or List<T>) that can be deserialized from a JSON object. JsonObjectAttribute can also be added to the type to force it to deserialize from a JSON object.
Path '0', line 1, position 5.
NOTE: Exception says is trying to deserialize into
'System.Collections.Generic.List`1[CCSN.Models.Patient]'
In c# that would be a List<Patient>
.
Statement in PatientServices.Addpat in which exception is believed to occur:
var x = await firebaseClient
.Child($"Specalists/406707265/Patients")
.PostAsync(new Patient(patient));
Those statements must lead to this - the lower-level line in which exception occurs:
return JsonConvert.DeserializeObject<TEntity>(json);
- json (skipping most of it):
{
"0":{
"Appointments":[
{"AppointmentDate":"2022-04-12T00:00:00+03:00"
}
],
"ID": "0",
"PatientName": "Ghaidaa"
},
"-N-tZ6hbyPpWOWeoo9o4": {
"ID": "45455184",
"PatientName": "sgagaga"
}
}
- TEntity:
Based on the error message, TEntity is presumably List<Patient>
.
The problem is that the json
(shown above) isn't in the expected format. It is a dynamic object
with keys "0"
, "1"
, "-N-tZ6hbyPpWOWeoo9o4"
.
The calling code is expecting a json array
, which would look like this:
[ {
"Appointments":[
{"AppointmentDate":"2022-04-12T00:00:00+03:00"
}
],
"ID": "0",
"PatientName": "Ghaidaa"
},
{
"ID": "45455184",
"PatientName": "sgagaga"
}
]
The difference is easiest to see by examining the beginning and end of the json.
One way to fix is to deserialize to a Dictionary
. Then extract the values of the Dictionary into a list.
Find code that looks something like the line below. Replace:
var patients = await Helper.Get<List<Patient>>(url);
With:
var patientsDict = await Helper.Get<Dictionary<string, Patient>>(url);
var patients = patientsDict.Values;
Or depending on how you use it, might change the last line to:
var patients = patientsDict.Values.ToList();
An ALTERNATIVE way to fix is to change the server side, so that it sends an array of Patients
instead of a dynamic object
.
--- Making that change is beyond the scope of this answer ---
Sources
This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.
Source: Stack Overflow
Solution | Source |
---|---|
Solution 1 |