internal TinyJsonObject CreateObjectFromJsonHandle(JsonKeyHandle jsonKeyHandle) { TinyJsonObject value = new TinyJsonObject { m_Data = this, Type = JsonKeyType(jsonKeyHandle) }; switch (JsonKeyType(jsonKeyHandle)) { case JsonValueType.Bool: value.m_BoolVal = m_BoolBuffer[LocationInValueBuffer(jsonKeyHandle)]; break; case JsonValueType.Int: value.m_IntVal = m_IntBuffer[LocationInValueBuffer(jsonKeyHandle)]; break; case JsonValueType.Float: value.m_FloatVal = m_FloatBuffer[LocationInValueBuffer(jsonKeyHandle)]; break; case JsonValueType.String: value.m_StringRefHandle = jsonKeyHandle; break; case JsonValueType.Array: value.m_ArrayRefHandle = jsonKeyHandle; break; case JsonValueType.Object: value.m_Data.m_RootObjMap = m_ObjectBuffer[LocationInValueBuffer(jsonKeyHandle)]; break; } return(value); }
internal void AddOrUpdateString(FixedString128 key, TinyJsonObject value) { JsonKeyHandle jsonRefHandle; if (m_RootObjMap.ContainsKey(key)) { jsonRefHandle = m_RootObjMap[key]; if (JsonKeyType(jsonRefHandle) == JsonValueType.String) { UpdateStringBufferFromObjectBasedOnVariant(value, jsonRefHandle); return; } // remove the old type completely and add a new one as normal RemoveValueFromBuffer(jsonRefHandle); } jsonRefHandle = new JsonKeyHandle(ref this, JsonValueType.String, m_StringBuffer.Length); if (!value.m_StringVal.IsEmpty) { m_StringBuffer.Add(value.m_StringVal[0]); value.m_StringVal.Dispose(); } else { m_StringBuffer.Add(value.m_Data.m_StringBuffer[value.m_Data.LocationInValueBuffer(value.m_StringRefHandle)]); } value.m_StringVal.Dispose(); m_RootObjMap[key] = jsonRefHandle; }
/** * Adds the object to the correct buffer associated with the provided key. */ internal void AddOrUpdateField(FixedString128 key, TinyJsonObject value) { switch (value.Type) { case JsonValueType.Bool: AddOrUpdateBool(key, value); break; case JsonValueType.Int: AddOrUpdateInt(key, value); break; case JsonValueType.Float: AddOrUpdateFloat(key, value); break; case JsonValueType.String: AddOrUpdateString(key, value); break; case JsonValueType.Array: var tinyJsonArray = value.AsArray(); AddOrUpdateArray(key, ref tinyJsonArray); break; case JsonValueType.Object: AddOrUpdateObject(key, ref value.m_Data); break; default: InvalidJsonTypeException(); return; } }
public TinyJsonInterface(Allocator allocator) { m_RootData = new TinyJsonData(allocator); Object = new TinyJsonObject { Type = JsonValueType.Object, m_Data = m_RootData }; }
internal void DeepCopyFields(ref TinyJsonData source) { TinyJsonObject.CheckNotSameObject(source, this); foreach (var keyValue in source.m_RootObjMap) { var objectCopy = source.CreateObjectFromJsonHandle(keyValue.Value); // read from source AddOrUpdateField(keyValue.Key, objectCopy); // write to destination } }
// A tiny json object of type string can either: // have its data uninitialized, but stringVal initialized with the string // or have its data initialized, and its stringVal is empty but its stringValueRef is initialized to its // location within the data buffer of the object void UpdateStringBufferFromObjectBasedOnVariant(TinyJsonObject value, JsonKeyHandle jsonRefHandle) { if (!value.m_StringVal.IsEmpty) { m_StringBuffer[LocationInValueBuffer(jsonRefHandle)] = value.m_StringVal[0]; value.m_StringVal.Dispose(); } else { m_StringBuffer[LocationInValueBuffer(jsonRefHandle)] = value.m_Data.m_StringBuffer[value.m_Data.LocationInValueBuffer(value.m_StringRefHandle)]; } }
internal JsonKeyHandle CreateNestedObject(out TinyJsonObject value) { var handle = new JsonKeyHandle(ref this, JsonValueType.Object, m_ObjectBuffer.Length); var objMap = new UnsafeHashMap <FixedString128, JsonKeyHandle>(10, m_Allocator); m_ObjectBuffer.Add(objMap); value = new TinyJsonObject { m_Data = this, Type = JsonValueType.Object }; value.m_Data.m_RootObjMap = objMap; return(handle); }
internal void AddOrUpdateInt(FixedString128 key, TinyJsonObject value) { JsonKeyHandle jsonRefHandle; if (m_RootObjMap.ContainsKey(key)) { jsonRefHandle = m_RootObjMap[key]; if (JsonKeyType(jsonRefHandle) == JsonValueType.Int) { // simple value swap if its the same type m_IntBuffer[LocationInValueBuffer(jsonRefHandle)] = value.AsInt(); return; } // remove the old type completely and add a new one as normal RemoveValueFromBuffer(jsonRefHandle); } jsonRefHandle = new JsonKeyHandle(ref this, JsonValueType.Int, m_IntBuffer.Length); m_IntBuffer.Add(value.AsInt()); m_RootObjMap[key] = jsonRefHandle; }