JTokenWriter
Represents a writer that provides a fast, non-cached, forward-only way of generating JSON data.
using Newtonsoft.Json.Utilities;
using System;
using System.Globalization;
using System.Numerics;
using System.Runtime.CompilerServices;
namespace Newtonsoft.Json.Linq
{
[System.Runtime.CompilerServices.NullableContext(2)]
[System.Runtime.CompilerServices.Nullable(0)]
public class JTokenWriter : JsonWriter
{
private JContainer _token;
private JContainer _parent;
private JValue _value;
private JToken _current;
public JToken CurrentToken => _current;
public JToken Token {
get {
if (_token != null)
return _token;
return _value;
}
}
[System.Runtime.CompilerServices.NullableContext(1)]
public JTokenWriter(JContainer container)
{
ValidationUtils.ArgumentNotNull(container, "container");
_token = container;
_parent = container;
}
public JTokenWriter()
{
}
public override void Flush()
{
}
public override void Close()
{
base.Close();
}
public override void WriteStartObject()
{
base.WriteStartObject();
AddParent(new JObject());
}
[System.Runtime.CompilerServices.NullableContext(1)]
private void AddParent(JContainer container)
{
if (_parent == null)
_token = container;
else
_parent.AddAndSkipParentCheck(container);
_parent = container;
_current = container;
}
private void RemoveParent()
{
_current = _parent;
_parent = _parent.Parent;
if (_parent != null && _parent.Type == JTokenType.Property)
_parent = _parent.Parent;
}
public override void WriteStartArray()
{
base.WriteStartArray();
AddParent(new JArray());
}
[System.Runtime.CompilerServices.NullableContext(1)]
public override void WriteStartConstructor(string name)
{
base.WriteStartConstructor(name);
AddParent(new JConstructor(name));
}
protected override void WriteEnd(JsonToken token)
{
RemoveParent();
}
[System.Runtime.CompilerServices.NullableContext(1)]
public override void WritePropertyName(string name)
{
(_parent as JObject)?.Remove(name);
AddParent(new JProperty(name));
base.WritePropertyName(name);
}
private void AddRawValue(object value, JTokenType type, JsonToken token)
{
AddJValue(new JValue(value, type), token);
}
internal void AddJValue(JValue value, JsonToken token)
{
if (_parent != null) {
if (_parent.TryAdd(value)) {
_current = _parent.Last;
if (_parent.Type == JTokenType.Property)
_parent = _parent.Parent;
}
} else {
_value = (value ?? JValue.CreateNull());
_current = _value;
}
}
public override void WriteValue(object value)
{
if (value is BigInteger) {
InternalWriteValue(JsonToken.Integer);
AddRawValue(value, JTokenType.Integer, JsonToken.Integer);
} else
base.WriteValue(value);
}
public override void WriteNull()
{
base.WriteNull();
AddJValue(JValue.CreateNull(), JsonToken.Null);
}
public override void WriteUndefined()
{
base.WriteUndefined();
AddJValue(JValue.CreateUndefined(), JsonToken.Undefined);
}
public override void WriteRaw(string json)
{
base.WriteRaw(json);
AddJValue(new JRaw(json), JsonToken.Raw);
}
public override void WriteComment(string text)
{
base.WriteComment(text);
AddJValue(JValue.CreateComment(text), JsonToken.Comment);
}
public override void WriteValue(string value)
{
base.WriteValue(value);
AddJValue(new JValue(value), JsonToken.String);
}
public override void WriteValue(int value)
{
base.WriteValue(value);
AddRawValue(value, JTokenType.Integer, JsonToken.Integer);
}
[CLSCompliant(false)]
public override void WriteValue(uint value)
{
base.WriteValue(value);
AddRawValue(value, JTokenType.Integer, JsonToken.Integer);
}
public override void WriteValue(long value)
{
base.WriteValue(value);
AddJValue(new JValue(value), JsonToken.Integer);
}
[CLSCompliant(false)]
public override void WriteValue(ulong value)
{
base.WriteValue(value);
AddJValue(new JValue(value), JsonToken.Integer);
}
public override void WriteValue(float value)
{
base.WriteValue(value);
AddJValue(new JValue(value), JsonToken.Float);
}
public override void WriteValue(double value)
{
base.WriteValue(value);
AddJValue(new JValue(value), JsonToken.Float);
}
public override void WriteValue(bool value)
{
base.WriteValue(value);
AddJValue(new JValue(value), JsonToken.Boolean);
}
public override void WriteValue(short value)
{
base.WriteValue(value);
AddRawValue(value, JTokenType.Integer, JsonToken.Integer);
}
[CLSCompliant(false)]
public override void WriteValue(ushort value)
{
base.WriteValue(value);
AddRawValue(value, JTokenType.Integer, JsonToken.Integer);
}
public override void WriteValue(char value)
{
base.WriteValue(value);
string value2 = value.ToString(CultureInfo.InvariantCulture);
AddJValue(new JValue(value2), JsonToken.String);
}
public override void WriteValue(byte value)
{
base.WriteValue(value);
AddRawValue(value, JTokenType.Integer, JsonToken.Integer);
}
[CLSCompliant(false)]
public override void WriteValue(sbyte value)
{
base.WriteValue(value);
AddRawValue(value, JTokenType.Integer, JsonToken.Integer);
}
public override void WriteValue(decimal value)
{
base.WriteValue(value);
AddJValue(new JValue(value), JsonToken.Float);
}
public override void WriteValue(DateTime value)
{
base.WriteValue(value);
value = DateTimeUtils.EnsureDateTime(value, base.DateTimeZoneHandling);
AddJValue(new JValue(value), JsonToken.Date);
}
public override void WriteValue(DateTimeOffset value)
{
base.WriteValue(value);
AddJValue(new JValue(value), JsonToken.Date);
}
public override void WriteValue(byte[] value)
{
base.WriteValue(value);
AddJValue(new JValue(value, JTokenType.Bytes), JsonToken.Bytes);
}
public override void WriteValue(TimeSpan value)
{
base.WriteValue(value);
AddJValue(new JValue(value), JsonToken.String);
}
public override void WriteValue(Guid value)
{
base.WriteValue(value);
AddJValue(new JValue(value), JsonToken.String);
}
public override void WriteValue(Uri value)
{
base.WriteValue(value);
AddJValue(new JValue(value), JsonToken.String);
}
[System.Runtime.CompilerServices.NullableContext(1)]
internal override void WriteToken(JsonReader reader, bool writeChildren, bool writeDateConstructorAsDate, bool writeComments)
{
JTokenReader jTokenReader = reader as JTokenReader;
if ((jTokenReader != null) & writeChildren & writeDateConstructorAsDate & writeComments) {
if (jTokenReader.TokenType != 0 || jTokenReader.Read()) {
JToken jToken = jTokenReader.CurrentToken.CloneToken(null);
if (_parent != null) {
_parent.Add(jToken);
_current = _parent.Last;
if (_parent.Type == JTokenType.Property) {
_parent = _parent.Parent;
InternalWriteValue(JsonToken.Null);
}
} else {
_current = jToken;
if (_token == null && _value == null) {
_token = (jToken as JContainer);
_value = (jToken as JValue);
}
}
jTokenReader.Skip();
}
} else
base.WriteToken(reader, writeChildren, writeDateConstructorAsDate, writeComments);
}
}
}