Beispiel #1
0
        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());
        }
Beispiel #3
0
        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;
                            });
                        })));