실제로 원하는 결과를 얻기 위해 사용할 수있는 몇 가지 매우 간단한 접근 방식이 있습니다.
예를 들어 현재 다음과 같이 정의 된 클래스가 있다고 가정 해 보겠습니다.
class Config
{
public Fizz ObsoleteSetting { get; set; }
public Bang ReplacementSetting { get; set; }
}
enum Fizz { Alpha, Beta, Gamma }
class Bang
{
public string Value { get; set; }
}
그리고 당신은 이것을 원합니다 :
string json = @"{ ""ObsoleteSetting"" : ""Gamma"" }";
// deserialize
Config config = JsonConvert.DeserializeObject<Config>(json);
// migrate
config.ReplacementSetting =
new Bang { Value = config.ObsoleteSetting.ToString() };
// serialize
json = JsonConvert.SerializeObject(config);
Console.WriteLine(json);
이것을 얻으려면 :
{"ReplacementSetting":{"Value":"Gamma"}}
접근 방식 1 : ShouldSerialize 메서드 추가
Json.NET에는 ShouldSerialize클래스에서 해당 메서드를 검색하여 속성을 조건부로 직렬화하는 기능이 있습니다 .
이 기능을 사용하려면 직렬화하지 않을 속성의 이름으로 대체 되는 부울 ShouldSerializeBlah()메서드를 클래스에 추가합니다 Blah. 이 메서드의 구현은 항상 false.
class Config
{
public Fizz ObsoleteSetting { get; set; }
public Bang ReplacementSetting { get; set; }
public bool ShouldSerializeObsoleteSetting()
{
return false;
}
}
참고 :이 접근 방식이 마음에 들지만 ShouldSerialize메서드 를 도입하여 클래스의 공용 인터페이스를 혼란스럽게하고 싶지 않은 경우 IContractResolver를 사용하여 프로그래밍 방식으로 동일한 작업을 수행 할 수 있습니다 . 문서에서 조건부 속성 직렬화 를 참조하십시오 .
접근 방식 2 : JObject를 사용하여 JSON 조작
JsonConvert.SerializeObject직렬화를 수행하는 데 사용 하는 대신 구성 개체를에로드 JObject한 다음 작성하기 전에 JSON에서 원하지 않는 속성을 제거하기 만하면됩니다. 단지 몇 줄의 추가 코드입니다.
JObject jo = JObject.FromObject(config);
// remove the "ObsoleteSetting" JProperty from its parent
jo["ObsoleteSetting"].Parent.Remove();
json = jo.ToString();
접근법 3 : 속성의 영리한 (남용) 사용
- 적용
[JsonIgnore]직렬화하지 않으려 속성에 속성을 .
- 대체, 개인 추가원래 속성과 동일한 유형을 사용하여 클래스에 속성 setter를 . 해당 속성의 구현을 원래 속성으로 설정합니다.
[JsonProperty]대체 setter에 속성을 적용 하여 원래 속성과 동일한 JSON 이름을 지정합니다.
수정 된 Config클래스 는 다음과 같습니다 .
class Config
{
[JsonIgnore]
public Fizz ObsoleteSetting { get; set; }
[JsonProperty("ObsoleteSetting")]
private Fizz ObsoleteSettingAlternateSetter
{
// get is intentionally omitted here
set { ObsoleteSetting = value; }
}
public Bang ReplacementSetting { get; set; }
}