in Microsoft.Azure.Cosmos/src/Json/JsonWriter.JsonBinaryWriter.cs [1623:1805]
private void ForceRewriteRawJsonValue(
ReadOnlyMemory<byte> rootBuffer,
int valueOffset,
UniformArrayInfo externalArrayInfo,
bool isFieldName,
IJsonStringDictionary jsonStringDictionary)
{
ReadOnlyMemory<byte> rawJsonValue = rootBuffer.Slice(valueOffset);
byte typeMarker = rawJsonValue.Span[0];
if (externalArrayInfo != null)
{
this.WriteRawUniformArrayItem(rawJsonValue.Span, externalArrayInfo);
}
else
{
RawValueType rawType = (RawValueType)RawValueTypes[typeMarker];
// Check for uniform number array support
if (this.enableNumberArrays && ((rawType == RawValueType.ArrNum) || (rawType == RawValueType.ArrArrNum)))
{
rawType = RawValueType.Token;
}
// Check for unsigned 64-bit integer support
if (this.enableUInt64Values && (rawType == RawValueType.NumUI64))
{
rawType = RawValueType.Token;
}
switch (rawType)
{
case RawValueType.Token:
{
int valueLength = JsonBinaryEncoding.GetValueLength(rawJsonValue.Span);
rawJsonValue = rawJsonValue.Slice(start: 0, length: valueLength);
// We only care if the type is a field name or not
this.JsonObjectState.RegisterToken(isFieldName ? JsonTokenType.FieldName : JsonTokenType.String);
this.binaryWriter.Write(rawJsonValue.Span);
if (!isFieldName)
{
this.bufferedContexts.Peek().Count++;
}
}
break;
case RawValueType.StrUsr:
case RawValueType.StrEncLen:
case RawValueType.StrL1:
case RawValueType.StrL2:
case RawValueType.StrL4:
this.WriteRawStringValue(rawType, rawJsonValue, isFieldName, this.jsonStringDictionary);
break;
case RawValueType.StrR1:
this.ForceRewriteRawJsonValue(
rootBuffer,
JsonBinaryEncoding.GetFixedSizedValue<byte>(rawJsonValue.Slice(start: 1).Span),
default,
isFieldName,
jsonStringDictionary);
break;
case RawValueType.StrR2:
this.ForceRewriteRawJsonValue(
rootBuffer,
JsonBinaryEncoding.GetFixedSizedValue<ushort>(rawJsonValue.Slice(start: 1).Span),
default,
isFieldName,
jsonStringDictionary);
break;
case RawValueType.StrR3:
this.ForceRewriteRawJsonValue(
rootBuffer,
JsonBinaryEncoding.GetFixedSizedValue<JsonBinaryEncoding.UInt24>(rawJsonValue.Slice(start: 1).Span),
default,
isFieldName,
jsonStringDictionary);
break;
case RawValueType.StrR4:
this.ForceRewriteRawJsonValue(
rootBuffer,
JsonBinaryEncoding.GetFixedSizedValue<int>(rawJsonValue.Slice(start: 1).Span),
default,
isFieldName,
jsonStringDictionary);
break;
case RawValueType.Arr1:
{
this.JsonObjectState.RegisterToken(JsonTokenType.BeginArray);
this.binaryWriter.Write(typeMarker);
this.ForceRewriteRawJsonValue(
rootBuffer,
valueOffset: valueOffset + 1,
externalArrayInfo: default,
isFieldName: false,
jsonStringDictionary: jsonStringDictionary);
this.JsonObjectState.RegisterToken(JsonTokenType.EndArray);
}
break;
case RawValueType.Obj1:
{
this.JsonObjectState.RegisterToken(JsonTokenType.BeginObject);
this.binaryWriter.Write(typeMarker);
this.ForceRewriteRawJsonValue(
rootBuffer,
valueOffset: valueOffset + 1,
externalArrayInfo: default,
isFieldName: true,
jsonStringDictionary: jsonStringDictionary);
int nameLength = JsonBinaryEncoding.GetValueLength(rawJsonValue.Slice(start: 1).Span);
this.ForceRewriteRawJsonValue(
rootBuffer,
valueOffset: valueOffset + 1 + nameLength,
externalArrayInfo: default,
isFieldName: false,
jsonStringDictionary: jsonStringDictionary);
this.JsonObjectState.RegisterToken(JsonTokenType.EndObject);
}
break;
case RawValueType.Arr:
{
this.WriteArrayStart();
foreach (JsonBinaryEncoding.Enumerator.ArrayItem arrayItem in JsonBinaryEncoding.Enumerator.GetArrayItems(rootBuffer, valueOffset, externalArrayInfo))
{
this.ForceRewriteRawJsonValue(
rootBuffer,
arrayItem.Offset,
arrayItem.ExternalArrayInfo,
isFieldName,
jsonStringDictionary);
}
this.WriteArrayEnd();
}
break;
case RawValueType.Obj:
{
this.WriteObjectStart();
foreach (JsonBinaryEncoding.Enumerator.ObjectProperty property in JsonBinaryEncoding.Enumerator.GetObjectProperties(rootBuffer, valueOffset))
{
this.ForceRewriteRawJsonValue(rootBuffer, property.NameOffset, externalArrayInfo: default, isFieldName: true, jsonStringDictionary: this.jsonStringDictionary);
this.ForceRewriteRawJsonValue(rootBuffer, property.ValueOffset, externalArrayInfo: default, isFieldName: false, jsonStringDictionary: this.jsonStringDictionary);
}
this.WriteObjectEnd();
}
break;
case RawValueType.ArrNum:
this.WriteRawNumberArray(rawJsonValue.Span, GetUniformArrayInfo(rawJsonValue.Span));
break;
case RawValueType.ArrArrNum:
this.WriteRawNumberArrayArray(rawJsonValue.Span, GetUniformArrayInfo(rawJsonValue.Span));
break;
case RawValueType.NumUI64:
this.WriteNumberValue(GetFixedSizedValue<ulong>(rawJsonValue.Slice(1).Span));
break;
default:
throw new InvalidOperationException($"Unknown {nameof(RawValueType)} {rawType}.");
}
}
}