// Copyright © WireMock.Net using System; using System.Collections; using System.Diagnostics.CodeAnalysis; using System.Text; using Newtonsoft.Json; using Newtonsoft.Json.Linq; using WireMock.Serialization; namespace WireMock.Util; internal static class JsonUtils { public static bool IsJson(string? value) { if (string.IsNullOrWhiteSpace(value)) { return false; } value = value!.Trim(); return (value.StartsWith("{") && value.EndsWith("}")) || (value.StartsWith("[") && value.EndsWith("]")); } public static bool TryParseAsJObject(string? strInput, [NotNullWhen(true)] out JObject? value) { value = null; if (!IsJson(strInput)) { return false; } try { // Try to convert this string into a JToken value = JObject.Parse(strInput!); return true; } catch { return false; } } public static string Serialize(object value) { return JsonConvert.SerializeObject(value, JsonSerializationConstants.JsonSerializerSettingsIncludeNullValues); } public static byte[] SerializeAsPactFile(object value) { var json = JsonConvert.SerializeObject(value, JsonSerializationConstants.JsonSerializerSettingsPact); return Encoding.UTF8.GetBytes(json); } /// /// Load a Newtonsoft.Json.Linq.JObject from a string that contains JSON. /// Using : DateParseHandling = DateParseHandling.None /// /// A System.String that contains JSON. /// A Newtonsoft.Json.Linq.JToken populated from the string that contains JSON. public static JToken Parse(string json) { return JsonConvert.DeserializeObject(json, JsonSerializationConstants.JsonDeserializerSettingsWithDateParsingNone)!; } /// /// Deserializes the JSON to a .NET object. /// Using : DateParseHandling = DateParseHandling.None /// /// A System.String that contains JSON. /// The deserialized object from the JSON string. public static object DeserializeObject(string json) { return JsonConvert.DeserializeObject(json, JsonSerializationConstants.JsonDeserializerSettingsWithDateParsingNone)!; } /// /// Deserializes the JSON to the specified .NET type. /// Using : DateParseHandling = DateParseHandling.None /// /// A System.String that contains JSON. /// The deserialized object from the JSON string. public static T DeserializeObject(string json) { return JsonConvert.DeserializeObject(json, JsonSerializationConstants.JsonDeserializerSettingsWithDateParsingNone)!; } public static T? TryDeserializeObject(string json) { try { return JsonConvert.DeserializeObject(json); } catch { return default; } } public static T ParseJTokenToObject(object? value) { if (value != null && value.GetType() == typeof(T)) { return (T)value; } return value switch { JToken tokenValue => tokenValue.ToObject()!, _ => throw new NotSupportedException($"Unable to convert value to {typeof(T)}.") }; } public static JToken ConvertValueToJToken(object value) { // Check if JToken, string, IEnumerable or object switch (value) { case JToken tokenValue: return tokenValue; case string stringValue: return Parse(stringValue); case IEnumerable enumerableValue: return JArray.FromObject(enumerableValue); default: return JObject.FromObject(value); } } }