JSON 升级到 3.6.2 后序列化器不工作
JSON serializer Not Working After Upgrade To 3.6.2
我正在为我的一个应用程序使用 ASP.NET 样板。该应用程序在 3.5.0 版本的 Abp 上运行,模板是 ASP.NET Core with MVC。我最近将它升级到 3.6.2,升级没问题,但是当我 运行 时,所有 AJAX 调用现在都在 CamelCase 中返回 JSON 数据,之前它是在 PascalCase 中。我正在使用 DefaultContractResolver 进行 JSON 配置
我尝试了 Google 和 Whosebug 中可用的所有方法,但没有成功。我下载了最新的 ABP 模板并在那里添加了配置,但它在那里也不起作用。似乎序列化程序设置不适用。
有人知道怎么解决吗?
我的代码配置是:
services.AddMvc().AddJsonOptions(x =>
x.SerializerSettings.ContractResolver = new DefaultContractResolver());
如果您需要更多信息,请告诉我。
提前致谢。
在Startup.cs > ConfigureServices()方法中设置
services.PostConfigure<MvcJsonOptions>(options =>
{
options.SerializerSettings.ContractResolver = new DefaultContractResolver();
});
此答案适用于 this question。该问题被标记为该问题的重复项。它不能接受接受答案。因此我在这里发布答案。
这是在 C# 中反序列化 JSON 的代码,如果 JSON 是驼峰式命名并且您要反序列化的类型的 属性 名称是 PascalCase:
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:
/// </summary>
public class PascalCasePropertyNamesContractResolver : DefaultContractResolver
{
protected override string ResolvePropertyName(string propertyName)
{
return base
.ResolvePropertyName(propertyName)
.ToPascalCase();
}
}
public class MyClass
{
public string MyProperty { get; set; }
}
}
我正在为我的一个应用程序使用 ASP.NET 样板。该应用程序在 3.5.0 版本的 Abp 上运行,模板是 ASP.NET Core with MVC。我最近将它升级到 3.6.2,升级没问题,但是当我 运行 时,所有 AJAX 调用现在都在 CamelCase 中返回 JSON 数据,之前它是在 PascalCase 中。我正在使用 DefaultContractResolver 进行 JSON 配置
我尝试了 Google 和 Whosebug 中可用的所有方法,但没有成功。我下载了最新的 ABP 模板并在那里添加了配置,但它在那里也不起作用。似乎序列化程序设置不适用。
有人知道怎么解决吗?
我的代码配置是:
services.AddMvc().AddJsonOptions(x =>
x.SerializerSettings.ContractResolver = new DefaultContractResolver());
如果您需要更多信息,请告诉我。
提前致谢。
在Startup.cs > ConfigureServices()方法中设置
services.PostConfigure<MvcJsonOptions>(options =>
{
options.SerializerSettings.ContractResolver = new DefaultContractResolver();
});
此答案适用于 this question。该问题被标记为该问题的重复项。它不能接受接受答案。因此我在这里发布答案。
这是在 C# 中反序列化 JSON 的代码,如果 JSON 是驼峰式命名并且您要反序列化的类型的 属性 名称是 PascalCase:
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:
/// </summary>
public class PascalCasePropertyNamesContractResolver : DefaultContractResolver
{
protected override string ResolvePropertyName(string propertyName)
{
return base
.ResolvePropertyName(propertyName)
.ToPascalCase();
}
}
public class MyClass
{
public string MyProperty { get; set; }
}
}