#c# #json #.net #serialization
Вопрос:
У меня есть привязка данных к объекту. Теперь я хочу сериализовать его с помощью пользовательского имени свойства.
[JsonProperty(PropertyName = "KLM")]
public string ABC { get; set; } = "Test1";
[JsonProperty(PropertyName = "NOP")]
public string DEF { get; set; } = "Test2";
[JsonProperty(PropertyName = "QRS")]
public string GHI { get; set; } = "Test3";
Когда я сериализую этот объект, я хочу, чтобы ниже была сериализация
{ "KLM" : "Test1", "NOP" : "Test2", "QRS" : "Test3" }
вместо
{ "ABC" : "Test1", "DEF" : "Test2", "GHI" : "Test3" }
и когда вы десериализуете его с помощью приведенного ниже JSON, он должен работать просто отлично
{ "ABC" : "1Test", "DEF" : "2Test", "GHI" : "3Test" }
Этот вопрос, возможно, задавали много раз, но я не мог найти подходящего ответа.
Комментарии:
1. Вам нужно установить атрибуты отдельно для геттера и сеттера, чтобы получить разные имена свойств. т. е. — геттер для сериализации и сеттер для десериализации.
2. Вы можете использовать модели DTO для решения своей проблемы
Ответ №1:
Пожалуйста, попробуйте это:
using Newtonsoft.Json;
namespace Application.ConsoleApp
{
class Program
{
static void Main(string[] args)
{
var j = "{ "KLM" : "Test1", "NOP" : "Test2", "QRS" : "Test3" }";
var o = JsonConvert.DeserializeObject<MyJsonObject>(j);
var s = JsonConvert.SerializeObject(o);
}
}
public class MyJsonObject
{
[JsonProperty(PropertyName = "KLM")]
public string ABC { get; set; } = "Test1";
[JsonProperty(PropertyName = "NOP")]
public string DEF { get; set; } = "Test2";
[JsonProperty(PropertyName = "QRS")]
public string GHI { get; set; } = "Test3";
}
}
Возможно, вы используете различные инструменты для атрибутов и сериализации / десериализации. В моем примере вы можете видеть, что я использую библиотеку Newtonsoft. Я беру атрибуты и методы из этой библиотеки. Например, если вы используете атрибуты из Newtonsoft и методы из System.Text.Json, это не будет работать так, как вы хотите.
UPD:
Разве это не то, чего ты хочешь?
Изображение показывает, что это работает в обоих направлениях. Если json соответствует атрибутам, то он желателен по атрибутам. Если json соответствует именам свойств класса, то json десериализуется по именам свойств. Этот объект всегда желателен по атрибутам.
Извините, если я все еще неправильно вас понимаю!
Комментарии:
1. если ваш j станет { «ABC» : «1 тест», «DEF» : «2 тест», «GHI» : «3 тест» }, то вы получите нулевые значения в объекте
2. десериализатор будет искать имя свойства JSON вместо фактического имени свойства
3. Извините, может быть, я вас неправильно понял. Вы хотите, чтобы параметры заполнялись либо атрибутами, либо именами свойств?
4. Во время заполнения он должен учитывать имя свойства, а во время вывода JSON он должен учитывать имя атрибута, я надеюсь, что это имеет смысл.
5. Да, это работает для меня в обоих направлениях. Я использую Newtonsoft. Json v. 13.0.1.Возможно, это важно.