Сериализация Json UnitsNet показывает гораздо больше данных, чем в моем классе - PullRequest
0 голосов
/ 30 октября 2018

Я создал консольное приложение ядра .net, чтобы поиграть и изучить UnitsNet . В этом приложении у меня есть класс Person и его экземпляр, его заполнение и использование Json.NET для сериализации этого объекта перед его выводом на консоль.

Моя проблема в том, что вывод JSON содержит гораздо больше свойств, чем то, что есть в моем классе Person.

Dotnet Fiddle пример

В идеале мой вывод JSON был бы аналогичен приведенному ниже примеру, а не выводу по Fiddle, связанному выше.

{
"Acceleration": {
    "Value": 12.0,
    "Unit": 3,
    }
},
"Age": 42,
"BodyMass": {
    "StonePounds": {
    "Stone": 12.0,
    "Pounds": 5.0
    },
},
"Height": {
    "FeetInches": {
    "Feet": 5.0,
    "Inches": 10.0
    },
},
"Name": "Davey Jones",
"TopSpeed": {
    "MilesPerHour": 7.0,
}
}

Доступен пакет UnitsNet.Serialization.Json , но я не уверен, есть ли ответ там, в Json.NET или где-то еще.

Буду очень признателен за любые указатели в правильном направлении, и, поскольку это мой 1-й вопрос о переполнении стека, любая обратная связь относительно самого поста также будет классной.

1 Ответ

0 голосов
/ 30 октября 2018

Свойства, которые вы видите в вашем 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 для генерации миллиграмм, нанограмм и т. Д. Было проще выбрать Грамм в качестве базовой единицы массы.

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