【问题标题】:JSON serializer Not Working After Upgrade To 3.6.2升级到 3.6.2 后 JSON 序列化程序不工作
【发布时间】:2018-06-22 11:18:48
【问题描述】:

我正在为我的一个应用程序使用 ASP.NET 样板。该应用程序在 3.5.0 版本的 Abp 上,模板是带有 MVC 的 ASP.NET Core。我最近将它升级到 3.6.2,升级很好,但是当我运行它时,所有 AJAX 调用现在都在 CamelCase 中返回 JSON 数据,以前它是在 PascalCase 中。我正在使用 DefaultContractResolver 进行 JSON 配置

我尝试了 Google 和 StackOverflow 中提供的所有功能,但没有成功。我下载了最新的 ABP 模板并在那里添加了配置,但它在那里也不起作用。似乎没有应用序列化程序设置。

有人知道怎么解决吗?

我的代码配置是:

services.AddMvc().AddJsonOptions(x =>
            x.SerializerSettings.ContractResolver = new DefaultContractResolver());

如果您需要更多信息,请告诉我。

提前谢谢你。

【问题讨论】:

    标签: aspnetboilerplate


    【解决方案1】:

    Startup.cs > ConfigureServices()方法中设置

    services.PostConfigure<MvcJsonOptions>(options =>
    {
        options.SerializerSettings.ContractResolver = new DefaultContractResolver();
    });
    

    【讨论】:

    • 谢谢@Alper。像魅力一样工作。但我不明白为什么我们需要使用后配置。你知道他们改变了什么吗?因为它在具有相同配置的先前版本中运行良好。
    • 通过在 PostConfigure 中编写它,我们确保它不会被框架覆盖。 (我不确定,但最近可能已更改)
    【解决方案2】:

    此答案适用于this question。该问题被标记为该问题的副本。它不能接受接受答案。因此,我在这里发布答案。

    如果 JSON 采用 camelCase 格式并且您要反序列化的类型的属性名称采用 PascalCase 格式,以下是在 C# 中反序列化 JSON 的代码:

    using Microsoft.VisualStudio.TestTools.UnitTesting;
    using Newtonsoft.Json;
    using Newtonsoft.Json.Serialization;
    
    namespace j.Tests
    {
        [TestClass]
        public class MyStaticClassTests
        {
            [TestMethod]
            public void Sandbox()
            {
                var value = "My Value";
                var json = $"{{ \"myProperty\": \"{value}\" }}";
                var deserialized = json
                    .FromJsonPascalCase<MyClass>();
                Assert.IsNotNull(deserialized);
                Assert.AreEqual(deserialized.MyProperty, value);
            }
        }
    
        public static class StringExtensions
        {
            private static JsonSerializerSettings pascalCaseSettings =
                new JsonSerializerSettings
                {
                    ContractResolver = new PascalCasePropertyNamesContractResolver()
                };
    
            public static T FromJsonPascalCase<T>(this string json)
            {
                var deserialized = JsonConvert
                    .DeserializeObject<T>(
                    json,
                    pascalCaseSettings);
                return deserialized;
            }
    
            /// <summary>
            /// Converts a string from camelCase PascalCase
            /// Adapted from: https://andrewlock.net/serializing-a-pascalcase-newtonsoft-json-jobject-to-camelcase/
            /// </summary>
            public static string ToPascalCase(this string str)
            {
                if (!string.IsNullOrEmpty(str))
                {
                    return char.ToUpperInvariant(str[0]) + str.Substring(1);
                }
    
                return str;
            }
        }
    
        /// <summary>
        /// Adapted from: https://stackoverflow.com/a/55499707/569302
        /// </summary>
        public class PascalCasePropertyNamesContractResolver : DefaultContractResolver
        {
            protected override string ResolvePropertyName(string propertyName)
            {
                return base
                    .ResolvePropertyName(propertyName)
                    .ToPascalCase();
            }
        }
    
        public class MyClass
        {
            public string MyProperty { get; set; }
        }
    }
    

    【讨论】:

      猜你喜欢
      • 2018-05-30
      • 1970-01-01
      • 2011-01-11
      • 1970-01-01
      • 2014-08-05
      • 2012-08-11
      • 1970-01-01
      • 2014-11-07
      • 1970-01-01
      相关资源
      最近更新 更多