다음 클래스를 고려하십시오.
class MethodCallDescription
{
public string MethodName { get; set; }
public object[] MethodParameters { get; set; }
}
다음 JSON을 해당 클래스의 인스턴스로 역 직렬화하고 싶습니다.
{
"MethodName": "LaunchRockets",
"MethodParameters": [ "Long Range", 100, true ]
}
이렇게하면 string, int 및 bool이 아닌 MethodParameters
유형의 객체를 포함하는 배열이되는 것 같습니다 JsonElement
.
JsonSerializer에게 MethodParameters
예상 유형의 값을 포함하는 배열로 바꾸도록 어떻게 알릴 수 있습니까?
내가 건너 온 이 테스트 사용자 정의 사용하는 System.Text.Json 소스 코드 JsonConverter
(원래의 객체 타입 대신을 유지하지) 객체 직렬화에 대한 모방 Newtonsoft.Json의 행동을.
다음은이를 달성하는 데 사용할 수있는 맞춤형 변환기의 슬림화 된 버전입니다.
class SystemObjectNewtonsoftCompatibleConverter : JsonConverter<object>
{
public override object Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options)
{
return reader.TokenType switch
{
JsonTokenType.True => true,
JsonTokenType.False => false,
JsonTokenType.Number => reader.GetInt32(),
JsonTokenType.String => reader.GetString(),
_ => Fallback(ref reader)
};
object Fallback(ref Utf8JsonReader reader)
{
// Use JsonElement as fallback.
// Newtonsoft uses JArray or JObject.
using JsonDocument document = JsonDocument.ParseValue(ref reader);
return document.RootElement.Clone();
}
}
public override void Write(Utf8JsonWriter writer, object value, JsonSerializerOptions options) =>
throw new InvalidOperationException("Should not get here.");
}
해당 변환기를 사용하는이 예제는 보존되는 객체 유형을 보여줍니다.
const string json = @"{
""MethodName"": ""LaunchRockets"",
""MethodParameters"": [ ""Long Range"", 100, true ]
}";
var options = new JsonSerializerOptions();
options.Converters.Add(new SystemObjectNewtonsoftCompatibleConverter());
MethodCallDescription instance = JsonSerializer.Deserialize<MethodCallDescription>(json, options);
Console.WriteLine(instance.MethodName);
Console.WriteLine(string.Join(", ", instance.MethodParameters.Select(p => (p, p.GetType().Name))));
출력 제공 :
LaunchRockets
(Long Range, String), (100, Int32), (True, Boolean)
이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.
침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제
몇 마디 만하겠습니다