/// <typeparam name="string">A Firebase-generated new document ID</typeparam> public async Task <string> AddAsync <T>(T documentData) where T : class, new() { string documentJson = FirestormUtility.ToJsonDocument(documentData, ""); byte[] postData = Encoding.UTF8.GetBytes(documentJson); //The URL must NOT include document name var uwr = await FirestormConfig.Instance.UWRPost(stringBuilder.ToString(), new (string, string)[]
public static string ToJsonDocument(object value, string fullDocumentPath) { var writer = new JsonWriter(); writer.PrettyPrint = true; writer.WriteObjectStart(); writer.WritePropertyName("name"); //document name writer.Write(fullDocumentPath); WriteFields(value); /// <summary> /// "fields" is not surrounded by object { } after this call /// </summary> void WriteFields(object v) { writer.WritePropertyName("fields"); writer.WriteObjectStart(); //REFLESIA OF ETERNITY if (v == null) { throw new FirestormException($"Found null value in the object you are trying to make into a Json!"); } var fields = v.GetType().GetFields(BindingFlags.Public | BindingFlags.Instance); foreach (var field in fields) { //Debug.Log($"Propp {field.Name}"); writer.WritePropertyName(field.Name); bool hasTimestampAttribute = field.GetCustomAttribute <ServerTimestamp>() != null; var fieldObject = field.GetValue(v); WriterDecision(fieldObject, hasTimestampAttribute); void WriterDecision(object obj, bool timestampAttribute = false) { writer.WriteObjectStart(); var formatted = FirestormUtility.FormatForValueJson(obj); switch (obj) { case List <object> lo: writer.WritePropertyName(formatted.typeString); writer.WriteObjectStart(); writer.WritePropertyName("values"); writer.WriteArrayStart(); foreach (object fromArray in lo) { //probably explode if you put List<object> in List<object> WriterDecision(fromArray); } writer.WriteArrayEnd(); writer.WriteObjectEnd(); break; case byte[] by: //UnityEngine.Debug.Log($"WRITING BYTE"); writer.WritePropertyName(formatted.typeString); writer.Write(Convert.ToBase64String((byte[])formatted.objectForJson)); break; default: if (formatted.typeString == "mapValue") { writer.WritePropertyName(formatted.typeString); writer.WriteObjectStart(); WriteFields(formatted.objectForJson); writer.WriteObjectEnd(); } else { writer.WritePropertyName(formatted.typeString); writer.WriteSmart(formatted.objectForJson); } break; } writer.WriteObjectEnd(); } } writer.WriteObjectEnd(); //fields } //WriteFields writer.WriteObjectEnd(); //top return(writer.ToString()); }