Files
plexcsharp/LukeHagar/PlexAPI/SDK/Utils/ResponseBodyDeserializer.cs

132 lines
5.0 KiB
C#

//------------------------------------------------------------------------------
// <auto-generated>
// This code was generated by Speakeasy (https://speakeasy.com). DO NOT EDIT.
//
// Changes to this file may cause incorrect behavior and will be lost when
// the code is regenerated.
// </auto-generated>
//------------------------------------------------------------------------------
#nullable enable
namespace LukeHagar.PlexAPI.SDK.Utils
{
using System;
using System.Collections;
using System.Collections.Generic;
using System.Linq;
using System.Net.Http;
using System.Reflection;
using System.Text;
using Newtonsoft.Json;
using Newtonsoft.Json.Linq;
internal class ResponseBodyDeserializer
{
public static T? Deserialize<T>(string json, NullValueHandling nullValueHandling=NullValueHandling.Ignore, MissingMemberHandling missingMemberHandling=MissingMemberHandling.Ignore)
{
return JsonConvert.DeserializeObject<T>(json, new JsonSerializerSettings(){ NullValueHandling = nullValueHandling, MissingMemberHandling = missingMemberHandling, Converters = Utilities.GetJsonDeserializers(typeof(T))});
}
public static T DeserializeNotNull<T>(string json, NullValueHandling nullValueHandling=NullValueHandling.Ignore, MissingMemberHandling missingMemberHandling=MissingMemberHandling.Ignore)
{
var result = ResponseBodyDeserializer.Deserialize<T>(json, nullValueHandling, missingMemberHandling);
if (result == null)
{
throw new Exception($"Deserialization error: {typeof(T).Name} cannot be null.");
}
return result!;
}
public sealed class MissingMemberException : Exception
{
public MissingMemberException() : base("Missing member.") { }
}
public sealed class DeserializationException : Exception
{
public DeserializationException(Type type) : base($"Could not deserialize into {type} type.") { }
}
public static T? DeserializeUndiscriminatedUnionMember<T>(string json)
{
try
{
return Deserialize<T>(json, missingMemberHandling: MissingMemberHandling.Error);
}
catch (Exception ex)
{
if (ex is Newtonsoft.Json.JsonSerializationException &&
ex.Source == "Newtonsoft.Json" &&
ex.Message.Contains("Could not find member"))
{
throw new MissingMemberException();
}
else if (ex is Newtonsoft.Json.JsonReaderException ||
ex is Newtonsoft.Json.JsonSerializationException
)
{
throw new DeserializationException(typeof(T));
}
throw;
}
}
public static object DeserializeUndiscriminatedUnionFallback(System.Type type, object obj, string propertyName, string json)
{
MethodInfo? method = typeof(ResponseBodyDeserializer).GetMethod("Deserialize");
if (method != null)
{
MethodInfo generic = method!.MakeGenericMethod(type);
var args = new object[] { json, NullValueHandling.Ignore, MissingMemberHandling.Ignore };
var value = generic.Invoke(null, args);
PropertyInfo? propertyInfo = obj.GetType().GetProperty(propertyName!);
if (propertyInfo != null && value != null)
{
propertyInfo!.SetValue(obj, value!);
return obj;
}
}
throw new DeserializationException(type);
}
public static int MissingJsonProperties(System.Type type, string json)
{
int missing = 0;
JObject jo = JObject.Parse(json);
var jsonPropertyAttributes = type.GetProperties()
.Where(prop => Attribute.IsDefined(prop, typeof(JsonPropertyAttribute)))
.Select(prop => prop.GetCustomAttribute(typeof(JsonPropertyAttribute)) as JsonPropertyAttribute)
.Where(attr => attr != null && attr!.PropertyName != null)
.ToList();
foreach (var attr in jsonPropertyAttributes)
{
string propertyName = attr!.PropertyName!;
if (!jo.TryGetValue(propertyName, out var _value)){
missing++;
}
}
return missing;
}
public static int CompareFallbackCandidates(System.Type typeA, System.Type typeB, string json)
{
var missingA = MissingJsonProperties(typeA, json);
var missingB = MissingJsonProperties(typeB, json);
if (missingA == missingB)
{
return typeB.GetProperties().Count().CompareTo(typeA.GetProperties().Count());
}
return missingA.CompareTo(missingB);
}
}
}