JToken
public abstract class JToken : IJEnumerable<JToken>, IEnumerable<JToken>, IEnumerable, IJsonLineInfo, ICloneable, IDynamicMetaObjectProvider
Represents an abstract JSON token.
using Newtonsoft.Json.Linq.JsonPath;
using Newtonsoft.Json.Serialization;
using Newtonsoft.Json.Utilities;
using System;
using System.Collections;
using System.Collections.Generic;
using System.Diagnostics;
using System.Dynamic;
using System.Globalization;
using System.IO;
using System.Linq;
using System.Linq.Expressions;
using System.Numerics;
using System.Runtime.CompilerServices;
using System.Threading;
using System.Threading.Tasks;
namespace Newtonsoft.Json.Linq
{
[System.Runtime.CompilerServices.NullableContext(1)]
[System.Runtime.CompilerServices.Nullable(0)]
public abstract class JToken : IJEnumerable<JToken>, IEnumerable<JToken>, IEnumerable, IJsonLineInfo, ICloneable, IDynamicMetaObjectProvider
{
[System.Runtime.CompilerServices.NullableContext(0)]
private class LineInfoAnnotation
{
internal readonly int LineNumber;
internal readonly int LinePosition;
public LineInfoAnnotation(int lineNumber, int linePosition)
{
LineNumber = lineNumber;
LinePosition = linePosition;
}
}
[System.Runtime.CompilerServices.Nullable(2)]
private static JTokenEqualityComparer _equalityComparer;
[System.Runtime.CompilerServices.Nullable(2)]
private JContainer _parent;
[System.Runtime.CompilerServices.Nullable(2)]
private JToken _previous;
[System.Runtime.CompilerServices.Nullable(2)]
private JToken _next;
[System.Runtime.CompilerServices.Nullable(2)]
private object _annotations;
private static readonly JTokenType[] BooleanTypes = new JTokenType[6] {
JTokenType.Integer,
JTokenType.Float,
JTokenType.String,
JTokenType.Comment,
JTokenType.Raw,
JTokenType.Boolean
};
private static readonly JTokenType[] NumberTypes = new JTokenType[6] {
JTokenType.Integer,
JTokenType.Float,
JTokenType.String,
JTokenType.Comment,
JTokenType.Raw,
JTokenType.Boolean
};
private static readonly JTokenType[] BigIntegerTypes = new JTokenType[7] {
JTokenType.Integer,
JTokenType.Float,
JTokenType.String,
JTokenType.Comment,
JTokenType.Raw,
JTokenType.Boolean,
JTokenType.Bytes
};
private static readonly JTokenType[] StringTypes = new JTokenType[11] {
JTokenType.Date,
JTokenType.Integer,
JTokenType.Float,
JTokenType.String,
JTokenType.Comment,
JTokenType.Raw,
JTokenType.Boolean,
JTokenType.Bytes,
JTokenType.Guid,
JTokenType.TimeSpan,
JTokenType.Uri
};
private static readonly JTokenType[] GuidTypes = new JTokenType[5] {
JTokenType.String,
JTokenType.Comment,
JTokenType.Raw,
JTokenType.Guid,
JTokenType.Bytes
};
private static readonly JTokenType[] TimeSpanTypes = new JTokenType[4] {
JTokenType.String,
JTokenType.Comment,
JTokenType.Raw,
JTokenType.TimeSpan
};
private static readonly JTokenType[] UriTypes = new JTokenType[4] {
JTokenType.String,
JTokenType.Comment,
JTokenType.Raw,
JTokenType.Uri
};
private static readonly JTokenType[] CharTypes = new JTokenType[5] {
JTokenType.Integer,
JTokenType.Float,
JTokenType.String,
JTokenType.Comment,
JTokenType.Raw
};
private static readonly JTokenType[] DateTimeTypes = new JTokenType[4] {
JTokenType.Date,
JTokenType.String,
JTokenType.Comment,
JTokenType.Raw
};
private static readonly JTokenType[] BytesTypes = new JTokenType[5] {
JTokenType.Bytes,
JTokenType.String,
JTokenType.Comment,
JTokenType.Raw,
JTokenType.Integer
};
public static JTokenEqualityComparer EqualityComparer {
get {
if (_equalityComparer == null)
_equalityComparer = new JTokenEqualityComparer();
return _equalityComparer;
}
}
[System.Runtime.CompilerServices.Nullable(2)]
public JContainer Parent {
[System.Runtime.CompilerServices.NullableContext(2)]
[DebuggerStepThrough]
get {
return _parent;
}
[System.Runtime.CompilerServices.NullableContext(2)]
internal set {
_parent = value;
}
}
public JToken Root {
get {
JContainer parent = Parent;
if (parent == null)
return this;
while (parent.Parent != null) {
parent = parent.Parent;
}
return parent;
}
}
public abstract JTokenType Type { get; }
public abstract bool HasValues { get; }
[System.Runtime.CompilerServices.Nullable(2)]
public JToken Next {
[System.Runtime.CompilerServices.NullableContext(2)]
get {
return _next;
}
[System.Runtime.CompilerServices.NullableContext(2)]
internal set {
_next = value;
}
}
[System.Runtime.CompilerServices.Nullable(2)]
public JToken Previous {
[System.Runtime.CompilerServices.NullableContext(2)]
get {
return _previous;
}
[System.Runtime.CompilerServices.NullableContext(2)]
internal set {
_previous = value;
}
}
public string Path {
get {
if (Parent == null)
return string.Empty;
List<JsonPosition> list = new List<JsonPosition>();
JToken jToken = null;
for (JToken jToken2 = this; jToken2 != null; jToken2 = jToken2.Parent) {
JTokenType type = jToken2.Type;
JsonPosition item;
if ((uint)(type - 2) > 1) {
if (type == JTokenType.Property) {
JProperty jProperty = (JProperty)jToken2;
List<JsonPosition> list2 = list;
item = new JsonPosition(JsonContainerType.Object) {
PropertyName = jProperty.Name
};
list2.Add(item);
}
} else if (jToken != null) {
int position = ((IList<JToken>)jToken2).IndexOf(jToken);
List<JsonPosition> list3 = list;
item = new JsonPosition(JsonContainerType.Array) {
Position = position
};
list3.Add(item);
}
jToken = jToken2;
}
list.FastReverse();
return JsonPosition.BuildPath(list, null);
}
}
[System.Runtime.CompilerServices.Nullable(2)]
public virtual JToken this[object key] {
[return: System.Runtime.CompilerServices.Nullable(2)]
get {
throw new InvalidOperationException("Cannot access child value on {0}.".FormatWith(CultureInfo.InvariantCulture, GetType()));
}
[param: System.Runtime.CompilerServices.Nullable(2)]
set {
throw new InvalidOperationException("Cannot set child value on {0}.".FormatWith(CultureInfo.InvariantCulture, GetType()));
}
}
[System.Runtime.CompilerServices.Nullable(2)]
public virtual JToken First {
[System.Runtime.CompilerServices.NullableContext(2)]
get {
throw new InvalidOperationException("Cannot access child value on {0}.".FormatWith(CultureInfo.InvariantCulture, GetType()));
}
}
[System.Runtime.CompilerServices.Nullable(2)]
public virtual JToken Last {
[System.Runtime.CompilerServices.NullableContext(2)]
get {
throw new InvalidOperationException("Cannot access child value on {0}.".FormatWith(CultureInfo.InvariantCulture, GetType()));
}
}
IJEnumerable<JToken> IJEnumerable<JToken>.this[object key] {
get {
return this[key];
}
}
int IJsonLineInfo.LineNumber {
get {
return Annotation<LineInfoAnnotation>()?.LineNumber ?? 0;
}
}
int IJsonLineInfo.LinePosition {
get {
return Annotation<LineInfoAnnotation>()?.LinePosition ?? 0;
}
}
public virtual Task WriteToAsync(JsonWriter writer, CancellationToken cancellationToken, params JsonConverter[] converters)
{
throw new NotImplementedException();
}
public Task WriteToAsync(JsonWriter writer, params JsonConverter[] converters)
{
return WriteToAsync(writer, default(CancellationToken), converters);
}
public static Task<JToken> ReadFromAsync(JsonReader reader, CancellationToken cancellationToken = default(CancellationToken))
{
return ReadFromAsync(reader, null, cancellationToken);
}
[AsyncStateMachine(typeof(<ReadFromAsync>d__3))]
public static Task<JToken> ReadFromAsync(JsonReader reader, [System.Runtime.CompilerServices.Nullable(2)] JsonLoadSettings settings, CancellationToken cancellationToken = default(CancellationToken))
{
<ReadFromAsync>d__3 stateMachine = default(<ReadFromAsync>d__3);
stateMachine.<>t__builder = AsyncTaskMethodBuilder<JToken>.Create();
stateMachine.reader = reader;
stateMachine.settings = settings;
stateMachine.cancellationToken = cancellationToken;
stateMachine.<>1__state = -1;
stateMachine.<>t__builder.Start(ref stateMachine);
return stateMachine.<>t__builder.Task;
}
public static Task<JToken> LoadAsync(JsonReader reader, CancellationToken cancellationToken = default(CancellationToken))
{
return LoadAsync(reader, null, cancellationToken);
}
public static Task<JToken> LoadAsync(JsonReader reader, [System.Runtime.CompilerServices.Nullable(2)] JsonLoadSettings settings, CancellationToken cancellationToken = default(CancellationToken))
{
return ReadFromAsync(reader, settings, cancellationToken);
}
internal abstract JToken CloneToken([System.Runtime.CompilerServices.Nullable(2)] JsonCloneSettings settings);
internal abstract bool DeepEquals(JToken node);
[System.Runtime.CompilerServices.NullableContext(2)]
public static bool DeepEquals(JToken t1, JToken t2)
{
if (t1 != t2) {
if (t1 != null && t2 != null)
return t1.DeepEquals(t2);
return false;
}
return true;
}
internal JToken()
{
}
[System.Runtime.CompilerServices.NullableContext(2)]
public void AddAfterSelf(object content)
{
if (_parent == null)
throw new InvalidOperationException("The parent is missing.");
int num = _parent.IndexOfItem(this);
_parent.TryAddInternal(num + 1, content, false, true);
}
[System.Runtime.CompilerServices.NullableContext(2)]
public void AddBeforeSelf(object content)
{
if (_parent == null)
throw new InvalidOperationException("The parent is missing.");
int index = _parent.IndexOfItem(this);
_parent.TryAddInternal(index, content, false, true);
}
public IEnumerable<JToken> Ancestors()
{
return GetAncestors(false);
}
public IEnumerable<JToken> AncestorsAndSelf()
{
return GetAncestors(true);
}
internal IEnumerable<JToken> GetAncestors(bool self)
{
for (JToken current = self ? this : Parent; current != null; current = current.Parent) {
yield return current;
}
}
public IEnumerable<JToken> AfterSelf()
{
if (Parent != null) {
for (JToken o = Next; o != null; o = o.Next) {
yield return o;
}
}
}
public IEnumerable<JToken> BeforeSelf()
{
if (Parent != null) {
JToken o = Parent.First;
while (o != this && o != null) {
yield return o;
o = o.Next;
}
}
}
[System.Runtime.CompilerServices.NullableContext(2)]
public virtual T Value<T>([System.Runtime.CompilerServices.Nullable(1)] object key)
{
JToken jToken = this[key];
if (jToken != null)
return jToken.Convert<JToken, T>();
return default(T);
}
[return: System.Runtime.CompilerServices.Nullable(new byte[] {
0,
1
})]
public virtual JEnumerable<JToken> Children()
{
return JEnumerable<JToken>.Empty;
}
[System.Runtime.CompilerServices.NullableContext(0)]
[return: System.Runtime.CompilerServices.Nullable(new byte[] {
0,
1
})]
public JEnumerable<T> Children<T>() where T : JToken
{
return new JEnumerable<T>(Children().OfType<T>());
}
[System.Runtime.CompilerServices.NullableContext(2)]
[return: System.Runtime.CompilerServices.Nullable(new byte[] {
1,
2
})]
public virtual IEnumerable<T> Values<T>()
{
throw new InvalidOperationException("Cannot access child value on {0}.".FormatWith(CultureInfo.InvariantCulture, GetType()));
}
public void Remove()
{
if (_parent == null)
throw new InvalidOperationException("The parent is missing.");
_parent.RemoveItem(this);
}
public void Replace(JToken value)
{
if (_parent == null)
throw new InvalidOperationException("The parent is missing.");
_parent.ReplaceItem(this, value);
}
public abstract void WriteTo(JsonWriter writer, params JsonConverter[] converters);
public override string ToString()
{
return ToString(Formatting.Indented, Array.Empty<JsonConverter>());
}
public string ToString(Formatting formatting, params JsonConverter[] converters)
{
using (StringWriter stringWriter = new StringWriter(CultureInfo.InvariantCulture)) {
JsonTextWriter jsonTextWriter = new JsonTextWriter(stringWriter);
jsonTextWriter.Formatting = formatting;
WriteTo(jsonTextWriter, converters);
return stringWriter.ToString();
}
}
[return: System.Runtime.CompilerServices.Nullable(2)]
private static JValue EnsureValue(JToken value)
{
if (value == null)
throw new ArgumentNullException("value");
JProperty jProperty = value as JProperty;
if (jProperty != null)
value = jProperty.Value;
return value as JValue;
}
private static string GetType(JToken token)
{
ValidationUtils.ArgumentNotNull(token, "token");
JProperty jProperty = token as JProperty;
if (jProperty != null)
token = jProperty.Value;
return token.Type.ToString();
}
private static bool ValidateToken(JToken o, JTokenType[] validTypes, bool nullable)
{
if (Array.IndexOf(validTypes, o.Type) == -1) {
if (nullable) {
if (o.Type != JTokenType.Null)
return o.Type == JTokenType.Undefined;
return true;
}
return false;
}
return true;
}
public static explicit operator bool(JToken value)
{
JValue jValue = EnsureValue(value);
if (jValue == null || !ValidateToken(jValue, BooleanTypes, false))
throw new ArgumentException("Can not convert {0} to Boolean.".FormatWith(CultureInfo.InvariantCulture, GetType(value)));
object value2 = jValue.Value;
if (value2 is BigInteger) {
BigInteger value3 = (BigInteger)value2;
return Convert.ToBoolean((int)value3);
}
return Convert.ToBoolean(jValue.Value, CultureInfo.InvariantCulture);
}
public static explicit operator DateTimeOffset(JToken value)
{
JValue jValue = EnsureValue(value);
if (jValue == null || !ValidateToken(jValue, DateTimeTypes, false))
throw new ArgumentException("Can not convert {0} to DateTimeOffset.".FormatWith(CultureInfo.InvariantCulture, GetType(value)));
object value2 = jValue.Value;
if (value2 is DateTimeOffset)
return (DateTimeOffset)value2;
string text = jValue.Value as string;
if (text != null)
return DateTimeOffset.Parse(text, CultureInfo.InvariantCulture);
return new DateTimeOffset(Convert.ToDateTime(jValue.Value, CultureInfo.InvariantCulture));
}
public static explicit operator bool?(JToken value)
{
if (value == null)
return null;
JValue jValue = EnsureValue(value);
if (jValue == null || !ValidateToken(jValue, BooleanTypes, true))
throw new ArgumentException("Can not convert {0} to Boolean.".FormatWith(CultureInfo.InvariantCulture, GetType(value)));
object value2 = jValue.Value;
if (value2 is BigInteger) {
BigInteger value3 = (BigInteger)value2;
return Convert.ToBoolean((int)value3);
}
if (jValue.Value == null)
return null;
return Convert.ToBoolean(jValue.Value, CultureInfo.InvariantCulture);
}
public static explicit operator long(JToken value)
{
JValue jValue = EnsureValue(value);
if (jValue == null || !ValidateToken(jValue, NumberTypes, false))
throw new ArgumentException("Can not convert {0} to Int64.".FormatWith(CultureInfo.InvariantCulture, GetType(value)));
object value2 = jValue.Value;
if (value2 is BigInteger) {
BigInteger value3 = (BigInteger)value2;
return (long)value3;
}
return Convert.ToInt64(jValue.Value, CultureInfo.InvariantCulture);
}
public static explicit operator DateTime?(JToken value)
{
if (value == null)
return null;
JValue jValue = EnsureValue(value);
if (jValue == null || !ValidateToken(jValue, DateTimeTypes, true))
throw new ArgumentException("Can not convert {0} to DateTime.".FormatWith(CultureInfo.InvariantCulture, GetType(value)));
object value2 = jValue.Value;
if (value2 is DateTimeOffset)
return ((DateTimeOffset)value2).DateTime;
if (jValue.Value == null)
return null;
return Convert.ToDateTime(jValue.Value, CultureInfo.InvariantCulture);
}
public static explicit operator DateTimeOffset?(JToken value)
{
if (value == null)
return null;
JValue jValue = EnsureValue(value);
if (jValue == null || !ValidateToken(jValue, DateTimeTypes, true))
throw new ArgumentException("Can not convert {0} to DateTimeOffset.".FormatWith(CultureInfo.InvariantCulture, GetType(value)));
if (jValue.Value == null)
return null;
object value2 = jValue.Value;
if (value2 is DateTimeOffset)
return (DateTimeOffset)value2;
string text = jValue.Value as string;
if (text != null)
return DateTimeOffset.Parse(text, CultureInfo.InvariantCulture);
return new DateTimeOffset(Convert.ToDateTime(jValue.Value, CultureInfo.InvariantCulture));
}
public static explicit operator decimal?(JToken value)
{
if (value == null)
return null;
JValue jValue = EnsureValue(value);
if (jValue == null || !ValidateToken(jValue, NumberTypes, true))
throw new ArgumentException("Can not convert {0} to Decimal.".FormatWith(CultureInfo.InvariantCulture, GetType(value)));
object value2 = jValue.Value;
if (value2 is BigInteger) {
BigInteger value3 = (BigInteger)value2;
return (decimal)value3;
}
if (jValue.Value == null)
return null;
return Convert.ToDecimal(jValue.Value, CultureInfo.InvariantCulture);
}
public static explicit operator double?(JToken value)
{
if (value == null)
return null;
JValue jValue = EnsureValue(value);
if (jValue == null || !ValidateToken(jValue, NumberTypes, true))
throw new ArgumentException("Can not convert {0} to Double.".FormatWith(CultureInfo.InvariantCulture, GetType(value)));
object value2 = jValue.Value;
if (value2 is BigInteger) {
BigInteger value3 = (BigInteger)value2;
return (double)value3;
}
if (jValue.Value == null)
return null;
return Convert.ToDouble(jValue.Value, CultureInfo.InvariantCulture);
}
public static explicit operator char?(JToken value)
{
if (value == null)
return null;
JValue jValue = EnsureValue(value);
if (jValue == null || !ValidateToken(jValue, CharTypes, true))
throw new ArgumentException("Can not convert {0} to Char.".FormatWith(CultureInfo.InvariantCulture, GetType(value)));
object value2 = jValue.Value;
if (value2 is BigInteger) {
BigInteger value3 = (BigInteger)value2;
return (char)(ushort)value3;
}
if (jValue.Value == null)
return null;
return Convert.ToChar(jValue.Value, CultureInfo.InvariantCulture);
}
public static explicit operator int(JToken value)
{
JValue jValue = EnsureValue(value);
if (jValue == null || !ValidateToken(jValue, NumberTypes, false))
throw new ArgumentException("Can not convert {0} to Int32.".FormatWith(CultureInfo.InvariantCulture, GetType(value)));
object value2 = jValue.Value;
if (value2 is BigInteger) {
BigInteger value3 = (BigInteger)value2;
return (int)value3;
}
return Convert.ToInt32(jValue.Value, CultureInfo.InvariantCulture);
}
public static explicit operator short(JToken value)
{
JValue jValue = EnsureValue(value);
if (jValue == null || !ValidateToken(jValue, NumberTypes, false))
throw new ArgumentException("Can not convert {0} to Int16.".FormatWith(CultureInfo.InvariantCulture, GetType(value)));
object value2 = jValue.Value;
if (value2 is BigInteger) {
BigInteger value3 = (BigInteger)value2;
return (short)value3;
}
return Convert.ToInt16(jValue.Value, CultureInfo.InvariantCulture);
}
public static explicit operator ushort(JToken value)
{
JValue jValue = EnsureValue(value);
if (jValue == null || !ValidateToken(jValue, NumberTypes, false))
throw new ArgumentException("Can not convert {0} to UInt16.".FormatWith(CultureInfo.InvariantCulture, GetType(value)));
object value2 = jValue.Value;
if (value2 is BigInteger) {
BigInteger value3 = (BigInteger)value2;
return (ushort)value3;
}
return Convert.ToUInt16(jValue.Value, CultureInfo.InvariantCulture);
}
public static explicit operator char(JToken value)
{
JValue jValue = EnsureValue(value);
if (jValue == null || !ValidateToken(jValue, CharTypes, false))
throw new ArgumentException("Can not convert {0} to Char.".FormatWith(CultureInfo.InvariantCulture, GetType(value)));
object value2 = jValue.Value;
if (value2 is BigInteger) {
BigInteger value3 = (BigInteger)value2;
return (char)(ushort)value3;
}
return Convert.ToChar(jValue.Value, CultureInfo.InvariantCulture);
}
public static explicit operator byte(JToken value)
{
JValue jValue = EnsureValue(value);
if (jValue == null || !ValidateToken(jValue, NumberTypes, false))
throw new ArgumentException("Can not convert {0} to Byte.".FormatWith(CultureInfo.InvariantCulture, GetType(value)));
object value2 = jValue.Value;
if (value2 is BigInteger) {
BigInteger value3 = (BigInteger)value2;
return (byte)value3;
}
return Convert.ToByte(jValue.Value, CultureInfo.InvariantCulture);
}
public static explicit operator sbyte(JToken value)
{
JValue jValue = EnsureValue(value);
if (jValue == null || !ValidateToken(jValue, NumberTypes, false))
throw new ArgumentException("Can not convert {0} to SByte.".FormatWith(CultureInfo.InvariantCulture, GetType(value)));
object value2 = jValue.Value;
if (value2 is BigInteger) {
BigInteger value3 = (BigInteger)value2;
return (sbyte)value3;
}
return Convert.ToSByte(jValue.Value, CultureInfo.InvariantCulture);
}
public static explicit operator int?(JToken value)
{
if (value == null)
return null;
JValue jValue = EnsureValue(value);
if (jValue == null || !ValidateToken(jValue, NumberTypes, true))
throw new ArgumentException("Can not convert {0} to Int32.".FormatWith(CultureInfo.InvariantCulture, GetType(value)));
object value2 = jValue.Value;
if (value2 is BigInteger) {
BigInteger value3 = (BigInteger)value2;
return (int)value3;
}
if (jValue.Value == null)
return null;
return Convert.ToInt32(jValue.Value, CultureInfo.InvariantCulture);
}
public static explicit operator short?(JToken value)
{
if (value == null)
return null;
JValue jValue = EnsureValue(value);
if (jValue == null || !ValidateToken(jValue, NumberTypes, true))
throw new ArgumentException("Can not convert {0} to Int16.".FormatWith(CultureInfo.InvariantCulture, GetType(value)));
object value2 = jValue.Value;
if (value2 is BigInteger) {
BigInteger value3 = (BigInteger)value2;
return (short)value3;
}
if (jValue.Value == null)
return null;
return Convert.ToInt16(jValue.Value, CultureInfo.InvariantCulture);
}
public static explicit operator ushort?(JToken value)
{
if (value == null)
return null;
JValue jValue = EnsureValue(value);
if (jValue == null || !ValidateToken(jValue, NumberTypes, true))
throw new ArgumentException("Can not convert {0} to UInt16.".FormatWith(CultureInfo.InvariantCulture, GetType(value)));
object value2 = jValue.Value;
if (value2 is BigInteger) {
BigInteger value3 = (BigInteger)value2;
return (ushort)value3;
}
if (jValue.Value == null)
return null;
return Convert.ToUInt16(jValue.Value, CultureInfo.InvariantCulture);
}
public static explicit operator byte?(JToken value)
{
if (value == null)
return null;
JValue jValue = EnsureValue(value);
if (jValue == null || !ValidateToken(jValue, NumberTypes, true))
throw new ArgumentException("Can not convert {0} to Byte.".FormatWith(CultureInfo.InvariantCulture, GetType(value)));
object value2 = jValue.Value;
if (value2 is BigInteger) {
BigInteger value3 = (BigInteger)value2;
return (byte)value3;
}
if (jValue.Value == null)
return null;
return Convert.ToByte(jValue.Value, CultureInfo.InvariantCulture);
}
public static explicit operator sbyte?(JToken value)
{
if (value == null)
return null;
JValue jValue = EnsureValue(value);
if (jValue == null || !ValidateToken(jValue, NumberTypes, true))
throw new ArgumentException("Can not convert {0} to SByte.".FormatWith(CultureInfo.InvariantCulture, GetType(value)));
object value2 = jValue.Value;
if (value2 is BigInteger) {
BigInteger value3 = (BigInteger)value2;
return (sbyte)value3;
}
if (jValue.Value == null)
return null;
return Convert.ToSByte(jValue.Value, CultureInfo.InvariantCulture);
}
public static explicit operator DateTime(JToken value)
{
JValue jValue = EnsureValue(value);
if (jValue == null || !ValidateToken(jValue, DateTimeTypes, false))
throw new ArgumentException("Can not convert {0} to DateTime.".FormatWith(CultureInfo.InvariantCulture, GetType(value)));
object value2 = jValue.Value;
if (value2 is DateTimeOffset)
return ((DateTimeOffset)value2).DateTime;
return Convert.ToDateTime(jValue.Value, CultureInfo.InvariantCulture);
}
public static explicit operator long?(JToken value)
{
if (value == null)
return null;
JValue jValue = EnsureValue(value);
if (jValue == null || !ValidateToken(jValue, NumberTypes, true))
throw new ArgumentException("Can not convert {0} to Int64.".FormatWith(CultureInfo.InvariantCulture, GetType(value)));
object value2 = jValue.Value;
if (value2 is BigInteger) {
BigInteger value3 = (BigInteger)value2;
return (long)value3;
}
if (jValue.Value == null)
return null;
return Convert.ToInt64(jValue.Value, CultureInfo.InvariantCulture);
}
public static explicit operator float?(JToken value)
{
if (value == null)
return null;
JValue jValue = EnsureValue(value);
if (jValue == null || !ValidateToken(jValue, NumberTypes, true))
throw new ArgumentException("Can not convert {0} to Single.".FormatWith(CultureInfo.InvariantCulture, GetType(value)));
object value2 = jValue.Value;
if (value2 is BigInteger) {
BigInteger value3 = (BigInteger)value2;
return (float)value3;
}
if (jValue.Value == null)
return null;
return Convert.ToSingle(jValue.Value, CultureInfo.InvariantCulture);
}
public static explicit operator decimal(JToken value)
{
JValue jValue = EnsureValue(value);
if (jValue == null || !ValidateToken(jValue, NumberTypes, false))
throw new ArgumentException("Can not convert {0} to Decimal.".FormatWith(CultureInfo.InvariantCulture, GetType(value)));
object value2 = jValue.Value;
if (value2 is BigInteger) {
BigInteger value3 = (BigInteger)value2;
return (decimal)value3;
}
return Convert.ToDecimal(jValue.Value, CultureInfo.InvariantCulture);
}
public static explicit operator uint?(JToken value)
{
if (value == null)
return null;
JValue jValue = EnsureValue(value);
if (jValue == null || !ValidateToken(jValue, NumberTypes, true))
throw new ArgumentException("Can not convert {0} to UInt32.".FormatWith(CultureInfo.InvariantCulture, GetType(value)));
object value2 = jValue.Value;
if (value2 is BigInteger) {
BigInteger value3 = (BigInteger)value2;
return (uint)value3;
}
if (jValue.Value == null)
return null;
return Convert.ToUInt32(jValue.Value, CultureInfo.InvariantCulture);
}
public static explicit operator ulong?(JToken value)
{
if (value == null)
return null;
JValue jValue = EnsureValue(value);
if (jValue == null || !ValidateToken(jValue, NumberTypes, true))
throw new ArgumentException("Can not convert {0} to UInt64.".FormatWith(CultureInfo.InvariantCulture, GetType(value)));
object value2 = jValue.Value;
if (value2 is BigInteger) {
BigInteger value3 = (BigInteger)value2;
return (ulong)value3;
}
if (jValue.Value == null)
return null;
return Convert.ToUInt64(jValue.Value, CultureInfo.InvariantCulture);
}
public static explicit operator double(JToken value)
{
JValue jValue = EnsureValue(value);
if (jValue == null || !ValidateToken(jValue, NumberTypes, false))
throw new ArgumentException("Can not convert {0} to Double.".FormatWith(CultureInfo.InvariantCulture, GetType(value)));
object value2 = jValue.Value;
if (value2 is BigInteger) {
BigInteger value3 = (BigInteger)value2;
return (double)value3;
}
return Convert.ToDouble(jValue.Value, CultureInfo.InvariantCulture);
}
public static explicit operator float(JToken value)
{
JValue jValue = EnsureValue(value);
if (jValue == null || !ValidateToken(jValue, NumberTypes, false))
throw new ArgumentException("Can not convert {0} to Single.".FormatWith(CultureInfo.InvariantCulture, GetType(value)));
object value2 = jValue.Value;
if (value2 is BigInteger) {
BigInteger value3 = (BigInteger)value2;
return (float)value3;
}
return Convert.ToSingle(jValue.Value, CultureInfo.InvariantCulture);
}
public static explicit operator string(JToken value)
{
if (value == null)
return null;
JValue jValue = EnsureValue(value);
if (jValue == null || !ValidateToken(jValue, StringTypes, true))
throw new ArgumentException("Can not convert {0} to String.".FormatWith(CultureInfo.InvariantCulture, GetType(value)));
if (jValue.Value == null)
return null;
byte[] array = jValue.Value as byte[];
if (array != null)
return Convert.ToBase64String(array);
object value2 = jValue.Value;
if (value2 is BigInteger)
return ((BigInteger)value2).ToString(CultureInfo.InvariantCulture);
return Convert.ToString(jValue.Value, CultureInfo.InvariantCulture);
}
public static explicit operator uint(JToken value)
{
JValue jValue = EnsureValue(value);
if (jValue == null || !ValidateToken(jValue, NumberTypes, false))
throw new ArgumentException("Can not convert {0} to UInt32.".FormatWith(CultureInfo.InvariantCulture, GetType(value)));
object value2 = jValue.Value;
if (value2 is BigInteger) {
BigInteger value3 = (BigInteger)value2;
return (uint)value3;
}
return Convert.ToUInt32(jValue.Value, CultureInfo.InvariantCulture);
}
public static explicit operator ulong(JToken value)
{
JValue jValue = EnsureValue(value);
if (jValue == null || !ValidateToken(jValue, NumberTypes, false))
throw new ArgumentException("Can not convert {0} to UInt64.".FormatWith(CultureInfo.InvariantCulture, GetType(value)));
object value2 = jValue.Value;
if (value2 is BigInteger) {
BigInteger value3 = (BigInteger)value2;
return (ulong)value3;
}
return Convert.ToUInt64(jValue.Value, CultureInfo.InvariantCulture);
}
public static explicit operator byte[](JToken value)
{
if (value == null)
return null;
JValue jValue = EnsureValue(value);
if (jValue == null || !ValidateToken(jValue, BytesTypes, false))
throw new ArgumentException("Can not convert {0} to byte array.".FormatWith(CultureInfo.InvariantCulture, GetType(value)));
if (jValue.Value is string)
return Convert.FromBase64String(Convert.ToString(jValue.Value, CultureInfo.InvariantCulture));
object value2 = jValue.Value;
if (value2 is BigInteger)
return ((BigInteger)value2).ToByteArray();
byte[] array = jValue.Value as byte[];
if (array != null)
return array;
throw new ArgumentException("Can not convert {0} to byte array.".FormatWith(CultureInfo.InvariantCulture, GetType(value)));
}
public static explicit operator Guid(JToken value)
{
JValue jValue = EnsureValue(value);
if (jValue == null || !ValidateToken(jValue, GuidTypes, false))
throw new ArgumentException("Can not convert {0} to Guid.".FormatWith(CultureInfo.InvariantCulture, GetType(value)));
byte[] array = jValue.Value as byte[];
if (array != null)
return new Guid(array);
object value2 = jValue.Value;
if (!(value2 is Guid))
return new Guid(Convert.ToString(jValue.Value, CultureInfo.InvariantCulture));
return (Guid)value2;
}
public static explicit operator Guid?(JToken value)
{
if (value == null)
return null;
JValue jValue = EnsureValue(value);
if (jValue == null || !ValidateToken(jValue, GuidTypes, true))
throw new ArgumentException("Can not convert {0} to Guid.".FormatWith(CultureInfo.InvariantCulture, GetType(value)));
if (jValue.Value == null)
return null;
byte[] array = jValue.Value as byte[];
if (array != null)
return new Guid(array);
object value2 = jValue.Value;
Guid value3;
if (value2 is Guid) {
Guid guid = (Guid)value2;
value3 = guid;
} else
value3 = new Guid(Convert.ToString(jValue.Value, CultureInfo.InvariantCulture));
return value3;
}
public static explicit operator TimeSpan(JToken value)
{
JValue jValue = EnsureValue(value);
if (jValue == null || !ValidateToken(jValue, TimeSpanTypes, false))
throw new ArgumentException("Can not convert {0} to TimeSpan.".FormatWith(CultureInfo.InvariantCulture, GetType(value)));
object value2 = jValue.Value;
if (!(value2 is TimeSpan))
return ConvertUtils.ParseTimeSpan(Convert.ToString(jValue.Value, CultureInfo.InvariantCulture));
return (TimeSpan)value2;
}
public static explicit operator TimeSpan?(JToken value)
{
if (value == null)
return null;
JValue jValue = EnsureValue(value);
if (jValue == null || !ValidateToken(jValue, TimeSpanTypes, true))
throw new ArgumentException("Can not convert {0} to TimeSpan.".FormatWith(CultureInfo.InvariantCulture, GetType(value)));
if (jValue.Value == null)
return null;
object value2 = jValue.Value;
TimeSpan value3;
if (value2 is TimeSpan) {
TimeSpan timeSpan = (TimeSpan)value2;
value3 = timeSpan;
} else
value3 = ConvertUtils.ParseTimeSpan(Convert.ToString(jValue.Value, CultureInfo.InvariantCulture));
return value3;
}
public static explicit operator Uri(JToken value)
{
if (value == null)
return null;
JValue jValue = EnsureValue(value);
if (jValue == null || !ValidateToken(jValue, UriTypes, true))
throw new ArgumentException("Can not convert {0} to Uri.".FormatWith(CultureInfo.InvariantCulture, GetType(value)));
if (jValue.Value == null)
return null;
Uri uri = jValue.Value as Uri;
if ((object)uri == null)
return new Uri(Convert.ToString(jValue.Value, CultureInfo.InvariantCulture));
return uri;
}
private static BigInteger ToBigInteger(JToken value)
{
JValue jValue = EnsureValue(value);
if (jValue == null || !ValidateToken(jValue, BigIntegerTypes, false))
throw new ArgumentException("Can not convert {0} to BigInteger.".FormatWith(CultureInfo.InvariantCulture, GetType(value)));
return ConvertUtils.ToBigInteger(jValue.Value);
}
private static BigInteger? ToBigIntegerNullable(JToken value)
{
JValue jValue = EnsureValue(value);
if (jValue == null || !ValidateToken(jValue, BigIntegerTypes, true))
throw new ArgumentException("Can not convert {0} to BigInteger.".FormatWith(CultureInfo.InvariantCulture, GetType(value)));
if (jValue.Value == null)
return null;
return ConvertUtils.ToBigInteger(jValue.Value);
}
public static implicit operator JToken(bool value)
{
return new JValue(value);
}
public static implicit operator JToken(DateTimeOffset value)
{
return new JValue(value);
}
public static implicit operator JToken(byte value)
{
return new JValue(value);
}
public static implicit operator JToken(byte? value)
{
return new JValue(value);
}
public static implicit operator JToken(sbyte value)
{
return new JValue(value);
}
public static implicit operator JToken(sbyte? value)
{
return new JValue(value);
}
public static implicit operator JToken(bool? value)
{
return new JValue(value);
}
public static implicit operator JToken(long value)
{
return new JValue(value);
}
public static implicit operator JToken(DateTime? value)
{
return new JValue(value);
}
public static implicit operator JToken(DateTimeOffset? value)
{
return new JValue(value);
}
public static implicit operator JToken(decimal? value)
{
return new JValue(value);
}
public static implicit operator JToken(double? value)
{
return new JValue(value);
}
public static implicit operator JToken(short value)
{
return new JValue(value);
}
public static implicit operator JToken(ushort value)
{
return new JValue(value);
}
public static implicit operator JToken(int value)
{
return new JValue(value);
}
public static implicit operator JToken(int? value)
{
return new JValue(value);
}
public static implicit operator JToken(DateTime value)
{
return new JValue(value);
}
public static implicit operator JToken(long? value)
{
return new JValue(value);
}
public static implicit operator JToken(float? value)
{
return new JValue(value);
}
public static implicit operator JToken(decimal value)
{
return new JValue(value);
}
public static implicit operator JToken(short? value)
{
return new JValue(value);
}
public static implicit operator JToken(ushort? value)
{
return new JValue(value);
}
public static implicit operator JToken(uint? value)
{
return new JValue(value);
}
public static implicit operator JToken(ulong? value)
{
return new JValue(value);
}
public static implicit operator JToken(double value)
{
return new JValue(value);
}
public static implicit operator JToken(float value)
{
return new JValue(value);
}
public static implicit operator JToken([System.Runtime.CompilerServices.Nullable(2)] string value)
{
return new JValue(value);
}
public static implicit operator JToken(uint value)
{
return new JValue(value);
}
public static implicit operator JToken(ulong value)
{
return new JValue(value);
}
public static implicit operator JToken(byte[] value)
{
return new JValue(value);
}
public static implicit operator JToken([System.Runtime.CompilerServices.Nullable(2)] Uri value)
{
return new JValue(value);
}
public static implicit operator JToken(TimeSpan value)
{
return new JValue(value);
}
public static implicit operator JToken(TimeSpan? value)
{
return new JValue(value);
}
public static implicit operator JToken(Guid value)
{
return new JValue(value);
}
public static implicit operator JToken(Guid? value)
{
return new JValue(value);
}
IEnumerator IEnumerable.GetEnumerator()
{
return ((IEnumerable<JToken>)this).GetEnumerator();
}
IEnumerator<JToken> IEnumerable<JToken>.GetEnumerator()
{
return Children().GetEnumerator();
}
internal abstract int GetDeepHashCode();
public JsonReader CreateReader()
{
return new JTokenReader(this);
}
internal static JToken FromObjectInternal(object o, JsonSerializer jsonSerializer)
{
ValidationUtils.ArgumentNotNull(o, "o");
ValidationUtils.ArgumentNotNull(jsonSerializer, "jsonSerializer");
using (JTokenWriter jTokenWriter = new JTokenWriter()) {
jsonSerializer.Serialize(jTokenWriter, o);
return jTokenWriter.Token;
}
}
public static JToken FromObject(object o)
{
return FromObjectInternal(o, JsonSerializer.CreateDefault());
}
public static JToken FromObject(object o, JsonSerializer jsonSerializer)
{
return FromObjectInternal(o, jsonSerializer);
}
[System.Runtime.CompilerServices.NullableContext(2)]
public T ToObject<T>()
{
return (T)ToObject(typeof(T));
}
[return: System.Runtime.CompilerServices.Nullable(2)]
public object ToObject(Type objectType)
{
if (JsonConvert.DefaultSettings == null) {
bool isEnum;
PrimitiveTypeCode typeCode = ConvertUtils.GetTypeCode(objectType, out isEnum);
if (isEnum) {
if (Type == JTokenType.String)
try {
return ToObject(objectType, JsonSerializer.CreateDefault());
} catch (Exception innerException) {
Type type = objectType.IsEnum() ? objectType : Nullable.GetUnderlyingType(objectType);
throw new ArgumentException("Could not convert '{0}' to {1}.".FormatWith(CultureInfo.InvariantCulture, (string)this, type.Name), innerException);
}
if (Type == JTokenType.Integer)
return Enum.ToObject(objectType.IsEnum() ? objectType : Nullable.GetUnderlyingType(objectType), ((JValue)this).Value);
}
switch (typeCode) {
case PrimitiveTypeCode.BooleanNullable:
return (bool?)this;
case PrimitiveTypeCode.Boolean:
return (bool)this;
case PrimitiveTypeCode.CharNullable:
return (char?)this;
case PrimitiveTypeCode.Char:
return (char)this;
case PrimitiveTypeCode.SByte:
return (sbyte)this;
case PrimitiveTypeCode.SByteNullable:
return (sbyte?)this;
case PrimitiveTypeCode.ByteNullable:
return (byte?)this;
case PrimitiveTypeCode.Byte:
return (byte)this;
case PrimitiveTypeCode.Int16Nullable:
return (short?)this;
case PrimitiveTypeCode.Int16:
return (short)this;
case PrimitiveTypeCode.UInt16Nullable:
return (ushort?)this;
case PrimitiveTypeCode.UInt16:
return (ushort)this;
case PrimitiveTypeCode.Int32Nullable:
return (int?)this;
case PrimitiveTypeCode.Int32:
return (int)this;
case PrimitiveTypeCode.UInt32Nullable:
return (uint?)this;
case PrimitiveTypeCode.UInt32:
return (uint)this;
case PrimitiveTypeCode.Int64Nullable:
return (long?)this;
case PrimitiveTypeCode.Int64:
return (long)this;
case PrimitiveTypeCode.UInt64Nullable:
return (ulong?)this;
case PrimitiveTypeCode.UInt64:
return (ulong)this;
case PrimitiveTypeCode.SingleNullable:
return (float?)this;
case PrimitiveTypeCode.Single:
return (float)this;
case PrimitiveTypeCode.DoubleNullable:
return (double?)this;
case PrimitiveTypeCode.Double:
return (double)this;
case PrimitiveTypeCode.DecimalNullable:
return (decimal?)this;
case PrimitiveTypeCode.Decimal:
return (decimal)this;
case PrimitiveTypeCode.DateTimeNullable:
return (DateTime?)this;
case PrimitiveTypeCode.DateTime:
return (DateTime)this;
case PrimitiveTypeCode.DateTimeOffsetNullable:
return (DateTimeOffset?)this;
case PrimitiveTypeCode.DateTimeOffset:
return (DateTimeOffset)this;
case PrimitiveTypeCode.String:
return (string)this;
case PrimitiveTypeCode.GuidNullable:
return (Guid?)this;
case PrimitiveTypeCode.Guid:
return (Guid)this;
case PrimitiveTypeCode.Uri:
return (Uri)this;
case PrimitiveTypeCode.TimeSpanNullable:
return (TimeSpan?)this;
case PrimitiveTypeCode.TimeSpan:
return (TimeSpan)this;
case PrimitiveTypeCode.BigIntegerNullable:
return ToBigIntegerNullable(this);
case PrimitiveTypeCode.BigInteger:
return ToBigInteger(this);
}
}
return ToObject(objectType, JsonSerializer.CreateDefault());
}
[System.Runtime.CompilerServices.NullableContext(2)]
public T ToObject<T>([System.Runtime.CompilerServices.Nullable(1)] JsonSerializer jsonSerializer)
{
return (T)ToObject(typeof(T), jsonSerializer);
}
[System.Runtime.CompilerServices.NullableContext(2)]
public object ToObject(Type objectType, [System.Runtime.CompilerServices.Nullable(1)] JsonSerializer jsonSerializer)
{
ValidationUtils.ArgumentNotNull(jsonSerializer, "jsonSerializer");
using (JTokenReader reader = new JTokenReader(this)) {
(jsonSerializer as JsonSerializerProxy)?._serializer.SetupReader(reader, out CultureInfo _, out DateTimeZoneHandling? _, out DateParseHandling? _, out FloatParseHandling? _, out int? _, out string _);
return jsonSerializer.Deserialize(reader, objectType);
}
}
public static JToken ReadFrom(JsonReader reader)
{
return ReadFrom(reader, null);
}
public static JToken ReadFrom(JsonReader reader, [System.Runtime.CompilerServices.Nullable(2)] JsonLoadSettings settings)
{
ValidationUtils.ArgumentNotNull(reader, "reader");
if ((reader.TokenType == JsonToken.None) ? ((settings != null && settings.CommentHandling == CommentHandling.Ignore) ? reader.ReadAndMoveToContent() : reader.Read()) : (reader.TokenType != JsonToken.Comment || settings == null || settings.CommentHandling != 0 || reader.ReadAndMoveToContent())) {
IJsonLineInfo lineInfo = reader as IJsonLineInfo;
switch (reader.TokenType) {
case JsonToken.StartObject:
return JObject.Load(reader, settings);
case JsonToken.StartArray:
return JArray.Load(reader, settings);
case JsonToken.StartConstructor:
return JConstructor.Load(reader, settings);
case JsonToken.PropertyName:
return JProperty.Load(reader, settings);
case JsonToken.Integer:
case JsonToken.Float:
case JsonToken.String:
case JsonToken.Boolean:
case JsonToken.Date:
case JsonToken.Bytes: {
JValue jValue4 = new JValue(reader.Value);
jValue4.SetLineInfo(lineInfo, settings);
return jValue4;
}
case JsonToken.Comment: {
JValue jValue3 = JValue.CreateComment(reader.Value.ToString());
jValue3.SetLineInfo(lineInfo, settings);
return jValue3;
}
case JsonToken.Null: {
JValue jValue2 = JValue.CreateNull();
jValue2.SetLineInfo(lineInfo, settings);
return jValue2;
}
case JsonToken.Undefined: {
JValue jValue = JValue.CreateUndefined();
jValue.SetLineInfo(lineInfo, settings);
return jValue;
}
default:
throw JsonReaderException.Create(reader, "Error reading JToken from JsonReader. Unexpected token: {0}".FormatWith(CultureInfo.InvariantCulture, reader.TokenType));
}
}
throw JsonReaderException.Create(reader, "Error reading JToken from JsonReader.");
}
public static JToken Parse(string json)
{
return Parse(json, null);
}
public static JToken Parse(string json, [System.Runtime.CompilerServices.Nullable(2)] JsonLoadSettings settings)
{
using (JsonReader jsonReader = new JsonTextReader(new StringReader(json))) {
JToken result = Load(jsonReader, settings);
while (jsonReader.Read()) {
}
return result;
}
}
public static JToken Load(JsonReader reader, [System.Runtime.CompilerServices.Nullable(2)] JsonLoadSettings settings)
{
return ReadFrom(reader, settings);
}
public static JToken Load(JsonReader reader)
{
return Load(reader, null);
}
[System.Runtime.CompilerServices.NullableContext(2)]
internal void SetLineInfo(IJsonLineInfo lineInfo, JsonLoadSettings settings)
{
if ((settings == null || settings.LineInfoHandling == LineInfoHandling.Load) && lineInfo != null && lineInfo.HasLineInfo())
SetLineInfo(lineInfo.LineNumber, lineInfo.LinePosition);
}
internal void SetLineInfo(int lineNumber, int linePosition)
{
AddAnnotation(new LineInfoAnnotation(lineNumber, linePosition));
}
bool IJsonLineInfo.HasLineInfo()
{
return Annotation<LineInfoAnnotation>() != null;
}
[return: System.Runtime.CompilerServices.Nullable(2)]
public JToken SelectToken(string path)
{
return SelectToken(path, null);
}
[return: System.Runtime.CompilerServices.Nullable(2)]
public JToken SelectToken(string path, bool errorWhenNoMatch)
{
JsonSelectSettings settings = errorWhenNoMatch ? new JsonSelectSettings {
ErrorWhenNoMatch = true
} : null;
return SelectToken(path, settings);
}
[System.Runtime.CompilerServices.NullableContext(2)]
public JToken SelectToken([System.Runtime.CompilerServices.Nullable(1)] string path, JsonSelectSettings settings)
{
JPath jPath = new JPath(path);
JToken jToken = null;
foreach (JToken item in jPath.Evaluate(this, this, settings)) {
if (jToken != null)
throw new JsonException("Path returned multiple tokens.");
jToken = item;
}
return jToken;
}
public IEnumerable<JToken> SelectTokens(string path)
{
return SelectTokens(path, null);
}
public IEnumerable<JToken> SelectTokens(string path, bool errorWhenNoMatch)
{
JsonSelectSettings settings = errorWhenNoMatch ? new JsonSelectSettings {
ErrorWhenNoMatch = true
} : null;
return SelectTokens(path, settings);
}
public IEnumerable<JToken> SelectTokens(string path, [System.Runtime.CompilerServices.Nullable(2)] JsonSelectSettings settings)
{
return new JPath(path).Evaluate(this, this, settings);
}
protected virtual DynamicMetaObject GetMetaObject(Expression parameter)
{
return new DynamicProxyMetaObject<JToken>(parameter, this, new DynamicProxy<JToken>());
}
DynamicMetaObject IDynamicMetaObjectProvider.GetMetaObject(Expression parameter)
{
return GetMetaObject(parameter);
}
object ICloneable.Clone()
{
return DeepClone();
}
public JToken DeepClone()
{
return CloneToken(null);
}
public JToken DeepClone(JsonCloneSettings settings)
{
return CloneToken(settings);
}
public void AddAnnotation(object annotation)
{
if (annotation == null)
throw new ArgumentNullException("annotation");
if (_annotations == null)
_annotations = ((!(annotation is object[])) ? annotation : new object[1] {
annotation
});
else {
object[] array = _annotations as object[];
if (array == null)
_annotations = new object[2] {
_annotations,
annotation
};
else {
int i;
for (i = 0; i < array.Length && array[i] != null; i++) {
}
if (i == array.Length) {
Array.Resize(ref array, i * 2);
_annotations = array;
}
array[i] = annotation;
}
}
}
[return: System.Runtime.CompilerServices.Nullable(2)]
public T Annotation<T>() where T : class
{
if (_annotations != null) {
object[] array = _annotations as object[];
if (array == null)
return _annotations as T;
foreach (object obj in array) {
if (obj == null)
break;
T val = obj as T;
if (val != null)
return val;
}
}
return null;
}
[return: System.Runtime.CompilerServices.Nullable(2)]
public object Annotation(Type type)
{
if (type == (Type)null)
throw new ArgumentNullException("type");
if (_annotations != null) {
object[] array = _annotations as object[];
if (array == null) {
if (type.IsInstanceOfType(_annotations))
return _annotations;
} else {
foreach (object obj in array) {
if (obj == null)
break;
if (type.IsInstanceOfType(obj))
return obj;
}
}
}
return null;
}
public IEnumerable<T> Annotations<T>() where T : class
{
if (_annotations != null) {
object annotations2 = _annotations;
object[] annotations = annotations2 as object[];
if (annotations != null) {
foreach (object obj in annotations) {
if (obj == null)
break;
T val = obj as T;
if (val != null)
yield return val;
}
} else {
T val2 = _annotations as T;
if (val2 != null)
yield return val2;
}
}
}
public IEnumerable<object> Annotations(Type type)
{
if (type == (Type)null)
throw new ArgumentNullException("type");
if (_annotations != null) {
object annotations2 = _annotations;
object[] annotations = annotations2 as object[];
if (annotations != null) {
foreach (object obj in annotations) {
if (obj == null)
break;
if (type.IsInstanceOfType(obj))
yield return obj;
}
} else if (type.IsInstanceOfType(_annotations)) {
yield return _annotations;
}
}
}
public void RemoveAnnotations<T>() where T : class
{
if (_annotations != null) {
object[] array = _annotations as object[];
if (array == null) {
if (_annotations is T)
_annotations = null;
} else {
int i = 0;
int num = 0;
for (; i < array.Length; i++) {
object obj = array[i];
if (obj == null)
break;
if (!(obj is T))
array[num++] = obj;
}
if (num != 0) {
while (num < i) {
array[num++] = null;
}
} else
_annotations = null;
}
}
}
public void RemoveAnnotations(Type type)
{
if (type == (Type)null)
throw new ArgumentNullException("type");
if (_annotations != null) {
object[] array = _annotations as object[];
if (array == null) {
if (type.IsInstanceOfType(_annotations))
_annotations = null;
} else {
int i = 0;
int num = 0;
for (; i < array.Length; i++) {
object obj = array[i];
if (obj == null)
break;
if (!type.IsInstanceOfType(obj))
array[num++] = obj;
}
if (num != 0) {
while (num < i) {
array[num++] = null;
}
} else
_annotations = null;
}
}
}
internal void CopyAnnotations(JToken target, JToken source)
{
object[] array = source._annotations as object[];
if (array != null)
target._annotations = array.ToArray();
else
target._annotations = source._annotations;
}
}
}