Используйте protobuf-net для преобразования json в объект
Мне предоставили класс aC#, сгенерированный через protogen.
У меня есть ответ json, который я хочу преобразовать в объект (сопоставить с классом, сгенерированным из protogen).
Как мне этого добиться? Json, который у меня есть, похож на:
Test {Id:"0000001" InsertDateTime:"4/12/2018 01:01:01" ModifyDateTime:"4/12/2018 01:05:10" ParentId:"0000001"
Sample{Id:"0000002" InsertDateTime:"4/12/2018 01:01:01" ModifyDateTime:"4/12/2018 01:05:10"}
}
Основным именем класса является "Test", и оно имеет int, строковые свойства, а также свойства типа "class".
Я хочу преобразовать этот Json в объект класса, сгенерированный "protogen".
1 ответ
Protobuf-net реализует только спецификацию двоичных протокольных буферов (ProtoBuf).
Неясно, подразумеваете ли вы под "json" "JSON общего назначения, ничего общего с ProtoBuf", или вы имеете в виду "формат JSON протокола буферов, добавленный около 3.0".
Если вы имеете в виду универсальный JSON: тогда обычно почти любой сериализатор JSON будет работать нормально - Json.NET является хорошим вариантом по умолчанию, но существуют другие сериализаторы JSON. Это связано с тем, что protobuf-net пытается работать с идиоматическими объектами.NET, что означает, что он очень хорошо работает с другими инструментами, работающими с идиоматическими объектами.NET.
Если вы имеете в виду JSON, специфичный для ProtoBuf, то я бы предложил использовать официальную библиотеку Google C# ProtoBuf, которая реализует это. У меня просто не было необходимости или времени добавлять поддержку для этого в protobuf-net, и на сегодняшний день добавление этого было для меня очень низким приоритетом - я просто не видел, чтобы кто-нибудь просил об этом от меня.
Если у вас есть общий JSON, но макет JSON отличается от вашей модели protobuf, то, честно говоря, я бы рекомендовал две модели DTO:
- тот, который предназначен для работы с вашими данными JSON и выбранным вами сериализатором JSON (например, Json.NET)
- тот, который предназначен для работы с вашими данными ProtoBuf и выбранным вами сериализатором ProtoBuf (таким как protobuf-net)
и просто сопоставьте два представления с помощью обычного кода C# (или любого другого инструмента автоматического сопоставления по вашему выбору).
Иногда вы можете бороться с библиотекой сериализатора, чтобы заставить ее работать с объектной моделью, которая не соответствует форме данных, но по моему опыту это плохое использование времени и приводит к хрупкому, глючному коду.