Свойства, которые вы видите в вашем JSON, - это свойства «только для получения» Assembly
, Mass
, Length
и т. Д., Которые включают преобразования только для получения в другие единицы того же типа. Json.NET по умолчанию сериализует свойства, доступные только для получения, поэтому они включены. Поскольку они вам не нужны, UnitsNetJsonConverter.cs
из https://www.nuget.org/packages/UnitsNet.Serialization.JsonNet должны устранить их:
var settings = new JsonSerializerSettings
{
Converters = { new UnitsNetJsonConverter() },
};
string json = JsonConvert.SerializeObject(person, Formatting.Indented, settings);
Вы можете увидеть некоторые примеры использования этого конвертера в UnitsNetJsonConverterTests.cs
, написанном angularsen , например ::
public class UnitsNetJsonConverterTests
{
private readonly JsonSerializerSettings _jsonSerializerSettings;
protected UnitsNetJsonConverterTests()
{
_jsonSerializerSettings = new JsonSerializerSettings {Formatting = Formatting.Indented};
_jsonSerializerSettings.Converters.Add(new UnitsNetJsonConverter());
}
private string SerializeObject(object obj)
{
return JsonConvert.SerializeObject(obj, _jsonSerializerSettings).Replace("\r\n", "\n");
}
private T DeserializeObject<T>(string json)
{
return JsonConvert.DeserializeObject<T>(json, _jsonSerializerSettings);
}
public class Serialize : UnitsNetJsonConverterTests
{
// Snip
[Fact]
public void Mass_ExpectConstructedValueAndUnit()
{
Mass mass = Mass.FromPounds(200);
var expectedJson = "{\n \"Unit\": \"MassUnit.Pound\",\n \"Value\": 200.0\n}";
string json = SerializeObject(mass);
Assert.Equal(expectedJson, json);
}
// Snip
Обратите внимание, что ожидаемое значение JSON для Mass.FromPounds(200)
равно
{
"Unit": "MassUnit.Pound",
"Value": 200.0
}
Это сжато и лишено каких-либо ненужных свойств.
Наконец, учтите это примечание к документации :
Сериализация
UnitsNet.Serialization.JsonNet
( nuget , src , тесты ) для JSON.NET
Важно! Мы не можем гарантировать обратную совместимость, хотя мы постараемся сделать это на основе «наилучших усилий» и столкнуться с основной версией Nuget, когда необходимо внести изменения.
Базовая единица любой единицы должна рассматриваться как изменчивая, так как мы уже несколько раз меняли это в истории этой библиотеки. Либо для уменьшения ошибок точности общих модулей, либо для упрощения генерации кода. Примером является Масса, где базовая единица была сначала килограммом, поскольку это единица массы СИ, но для использования сценариев PowerShell для генерации миллиграмм, нанограмм и т. Д. Было проще выбрать Грамм в качестве базовой единицы массы.