public void SaveSettings() { string path = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "settings.json"); JsonSerializer jser = new JsonSerializer(); var json = JsonConvert.SerializeObject(Manager); using (StreamWriter sw = new StreamWriter(path)) { using (JsonWriter JWriter = new JsonTextWriter(sw)) { JWriter.Formatting = Formatting.Indented; JWriter.WriteCommentAsync($"\\***Auto Generated Settings****\\ \n"); jser.Serialize(JWriter, Manager); JWriter.WriteComment($" \n Последнее изменение : {DateTime.Now} "); } } }
public static async Task <string> AddUpdateFieldAsync <T>(string jsonSource, string fieldName, T value) { StringBuilder sb = new StringBuilder(); using (var sw = new StringWriter(sb)) using (JsonWriter writer = new JsonTextWriter(sw)) using (var sr = new StringReader(jsonSource)) using (JsonReader reader = new JsonTextReader(sr)) { writer.Formatting = Formatting.Indented; bool currentObjectHasTargetField = false; while (await reader.ReadAsync()) { if (reader.TokenType == JsonToken.EndObject && currentObjectHasTargetField == false) { await writer.WritePropertyNameAsync(fieldName); await writer.WriteValueAsync(value); await writer.WriteEndObjectAsync(); currentObjectHasTargetField = false; //reinitialize for next object } else if (reader.TokenType == JsonToken.PropertyName && reader.Value.ToString() == fieldName) { await writer.WritePropertyNameAsync(fieldName); await writer.WriteValueAsync(value); await reader.ReadAsync(); //read and ignore current value for target field currentObjectHasTargetField = true; //to not add target field at end of object } else { switch (reader.TokenType) { case JsonToken.PropertyName: await writer.WritePropertyNameAsync(reader.Value.ToString()); break; case JsonToken.Boolean: case JsonToken.Bytes: case JsonToken.Date: case JsonToken.Float: case JsonToken.Integer: case JsonToken.String: await writer.WriteValueAsync(reader.Value); break; case JsonToken.Null: await writer.WriteNullAsync(); break; case JsonToken.StartObject: await writer.WriteStartObjectAsync(); break; case JsonToken.StartArray: await writer.WriteStartArrayAsync(); break; case JsonToken.EndArray: await writer.WriteEndArrayAsync(); break; case JsonToken.EndObject: await writer.WriteEndObjectAsync(); currentObjectHasTargetField = false; //reinitialize break; case JsonToken.Comment: await writer.WriteCommentAsync(reader.Value.ToString()); break; } } } } return(sb.ToString()); }
public async Task SerializeAsync(Stream responseStream, IApplication httpApp, IHttpRequest request, ParameterInfo paramInfo, object obj) { var jsonCastersHttpApp = httpApp .GetType() .GetAttributesInterface <ICastJson>() .ToArray(); var encoding = request.TryGetAcceptCharset(out Encoding writerEncoding) ? writerEncoding : new UTF8Encoding(false); using (var textWriter = new StreamWriter(responseStream, encoding)) { var jsonWriter = new JsonTextWriter(textWriter); var serializer = new JsonSerializer(); var converter = new Serialization.ExtrudeConvert(request, httpApp); serializer.Converters.Add(converter); await WriteToStreamAsync(jsonWriter, serializer, obj); } async Task WriteToStreamAsync(JsonTextWriter jsonWriter, JsonSerializer serializer, object obj) { if (obj.IsNull()) { await jsonWriter.WriteNullAsync(); return; } await jsonWriter.WriteStartObjectAsync(); var members = obj.GetType() .GetPropertyAndFieldsWithAttributesInterface <IProvideApiValue>(); foreach (var(member, apiValueProvider) in members) { var memberValue = member.GetPropertyOrFieldValue(obj); if (memberValue.IsNull() && IgnoreNull) { continue; } await WriteAsync(member.GetAttributesInterface <ICastJson>(), onCouldNotCast : () => { var objType = obj.GetType(); return(WriteAsync(objType.GetAttributesInterface <ICastJson>(), () => WriteAsync(jsonCastersHttpApp, () => { var memberType = member.GetPropertyOrFieldType(); return WriteAsync(memberType.GetAttributesInterface <ICastJson>(), async() => { if (memberType.IsArray) { await jsonWriter.WritePropertyNameAsync(apiValueProvider.PropertyName); await WriteArrayAsync(memberType); return; } if (memberType.TryGetAttributeInterface(out IProvideSerialization serializationProvider)) { await jsonWriter.WritePropertyNameAsync(apiValueProvider.PropertyName); using (var cacheStream = new MemoryStream()) { await serializationProvider.SerializeAsync(cacheStream, httpApp, request, paramInfo, memberValue); var rawJson = cacheStream.ToArray().GetString(encoding); await jsonWriter.WriteRawValueAsync(rawJson); } return; } await jsonWriter.WriteCommentAsync( $"Cannot find {nameof(ICastJson)} interface for " + $"{member.DeclaringType.FullName}..{member.Name}"); return; }); })));