System.Text. Json сериализует значение 1.0 типа double к значению 1 типа int по умолчанию - PullRequest
1 голос
/ 20 апреля 2020

Я в процессе обновления до ASP. NET Core 3.1, после переключения на System.Text. Json заметил странное изменение результата в значениях с плавающей запятой. После исследования я понял, что System.Text. Json преобразует двойное значение в int. Например, рассмотрим простой контракт:

public class RowVector
{
    [JsonPropertyName("x")]
    public double X { get; set; }

    [JsonPropertyName("y")]
    public double Y { get; set; }

    [JsonPropertyName("z")]
    public double Z { get; set; }
}

var rowVector = new RowVector { X = 1.0, Y = 213.9, Z = 112.0 };
var serializedData = JsonSerializer.Serialize(rowVector);

Serialized-Data output with System.Text.Json :{"x":1,"y":213.9,"z":112}

Здесь x и z являются значениями int, тогда как в Newtonsoft. Json,

Serialized-Data output with Newtonsoft.Json :{"X":1.0,"Y":213.9,"Z":112.0}

Здесь x и z сохраняются как двойные .

Таким образом, для system.text. json при десериализации эти значения являются целыми числами, и это приводит к изменению в наших вычислениях обработки, любая идея, почему это реализовано таким образом в System.Text. Json

1 Ответ

5 голосов
/ 20 апреля 2020

Что вы видели, это известная проблема переносимости с JSON:

Числа в JSON являются агностическими c в отношении их представления в языках программирования , Хотя это позволяет сериализовать числа произвольной точности, это может привести к проблемам переносимости. Например, поскольку не делается различий между целочисленными значениями и значениями с плавающей запятой, некоторые реализации могут обрабатывать 42, 42.0 и 4.2E+1 как одно и то же число, а другие - нет.

Также см. здесь :

Например, валидатор на основе JavaScript может принимать 1.0 как целое число, тогда как jsonschema на основе Python этого не делает.

Так или иначе, проблемы переносимости возникают при передаче чисел в JSON.

. Вы всегда можете иметь своих собственных преобразователей для расширения / изменения поведение по умолчанию для сериализатора.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...