Mehdi Bugnard
Mehdi Bugnard

Reputation: 3979

JsonConvert throws a 'not a valid integer' exception when deserializing to a double

I get an exception when I try to deserialize to an object from a JSON string.

Input string '46.605' is not a valid integer. Path 'LatitudeCenter'

It's really weird because JsonConvert tries to deserialize an attribute as an integer but it actually is a double and not an integer.

I already checked in my Web API project. The attribute in my class is a double and same in web project.

The code I use in my web asp project:

using (var client = new HttpClient())
{
    client.BaseAddress = new Uri("myWebApiHostedUrl");
    client.DefaultRequestHeaders.Accept.Clear();
    client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));

    // Get the response
    HttpResponseMessage response = await client.GetAsync("api/NewMap/?SouthLatitude=46.600&WestLongitude=7.085&NorthLatitude=46.610&EastLongitude=7.095&Width=900&Height=900&isVoxelMap=true");
    string jsonData = response.Content.ReadAsStringAsync().Result;

    //Exception here
    NewMap dataMewMap = JsonConvert.DeserializeObject<NewMap>(jsonData, new JsonSerializerSettings() { Culture = CultureInfo.InvariantCulture,FloatParseHandling= FloatParseHandling.Double });
}

Here is my class:

public class NewMap
{
    // ...
    public double LatitudeCenter { get; set; }
    public double LongitudeCenter { get; set; }
    // ...
}

My JSON content:

{
    // ...
    "LatitudeCenter":46.605,
    "LongitudeCenter":7.09,
    "SouthLatitude":46.6,
    "ImageBingUrl":null,
    "PercentEnvironement_Plain":0,
    // ...
}

Upvotes: 12

Views: 17128

Answers (3)

ankhayra
ankhayra

Reputation: 11

If you came here because you ran into this error message, the answer may be:

'46.605' is not an integer! It has a decimal point. You need to either provide an integer, or change the object to another type.

I'm sorry, it's not an answer to the original question, but it's why I came here, and I searched how to set the culture, and whether I could change the dot to a comma while the simple answer is the data has always been a decimal, it just never had a decimal part until now, so the code expects an integer.

Upvotes: 1

farid mohammadi
farid mohammadi

Reputation: 11

I used:

Replace(".0,","") 

And it worked for me

Upvotes: 1

aybe
aybe

Reputation: 16662

It could very well be because your regional settings use something other than a 'dot' to represent what's after the integer part of a double, such as the fr-FR culture.

A rough guess is that the JsonConvert class uses methods for parsing numbers from .NET (there's no reason why it wouldn't after all), such as Double.TryParse. And these very method do by default, take into account your current culture.

Try setting the culture of JsonConvert to CultureInfo.InvariantCulture.

Upvotes: 12

Related Questions