Tak, można to zrobić za pomocą niestandardowego ContractResolver
.
Nie pokazałeś żadnego kodu, więc podam przykład. Załóżmy, że mam klasę Foo
, jak pokazano poniżej. Chcę, aby właściwości Id
i Name
w wynikach serializacji, ale zdecydowanie nie jestem zainteresowany AlternateName
i . Zaznaczam je jako [JsonIgnore]
. Chcę, aby opis się pojawił, ale czasami może to trwać naprawdę długo, więc użyłem niestandardowego JsonConverter
, aby ograniczyć jego długość. Chcę również użyć krótszej nazwy właściwości opisu, dlatego oznaczono ją jako [JsonProperty("Desc")]
.
class Foo
{
public int Id { get; set; }
public string Name { get; set; }
[JsonIgnore]
public string AlternateName { get; set; }
[JsonProperty("Desc")]
[JsonConverter(typeof(StringTruncatingConverter))]
public string Description { get; set; }
[JsonIgnore]
public string Color { get; set; }
}
Kiedy serializacji instancję wyżej ...
Foo foo = new Foo
{
Id = 1,
Name = "Thing 1",
AlternateName = "The First Thing",
Description = "This is some lengthy text describing Thing 1 which you'll no doubt find very interesting and useful.",
Color = "Yellow"
};
string json = JsonConvert.SerializeObject(foo, Formatting.Indented);
... uzyskać ten wynik:
{
"Id": 1,
"Name": "Thing 1",
"Desc": "This is some lengthy text describing Thing 1 "
}
Teraz, powiedzmy, że czasami chce się pełne wyjście JSON, ignorując moje dostosowania. Mogę użyć niestandardowego ContractResolver
do programowego "anulowania" atrybutów z klasy. Oto kod dla przelicznika:
class IgnoreJsonAttributesResolver : DefaultContractResolver
{
protected override IList<JsonProperty> CreateProperties(Type type, MemberSerialization memberSerialization)
{
IList<JsonProperty> props = base.CreateProperties(type, memberSerialization);
foreach (var prop in props)
{
prop.Ignored = false; // Ignore [JsonIgnore]
prop.Converter = null; // Ignore [JsonConverter]
prop.PropertyName = prop.UnderlyingName; // restore original property name
}
return props;
}
}
Aby skorzystać z rozpoznawania nazw, dodaję go do JsonSerializerSettings
i przekazać ustawienia do serializatora jak ten:
JsonSerializerSettings settings = new JsonSerializerSettings();
settings.ContractResolver = new IgnoreJsonAttributesResolver();
settings.Formatting = Formatting.Indented;
string json = JsonConvert.SerializeObject(foo, settings);
Wyjście zawiera teraz ignorowane właściwości, a opis nie jest już obcięty:
{
"Id": 1,
"Name": "Thing 1",
"AlternateName": "The First Thing",
"Description": "This is some lengthy text describing Thing 1 which you'll no doubt find very interesting and useful.",
"Color": "Yellow"
}
Pełna demo tutaj: https://dotnetfiddle.net/WZpeWt
może pokazać niektóre kodu, w jaki sposób udało się dostosować Json.NET tak daleko. –