在C#中,有效的变量名不能包含短划线。但在Json中,所有属性名称都是基于字符串的,因此对于C#变量名来说,被视为无效字符的字符在Json中将被视为有效字符。
我的问题是,JSON是如何实现的。当试图反序列化为匿名类型时,在属性名称中包含Dash或其他无效数据的Net句柄,更重要的是,用什么替换匿名类型中的无效字符来捕获它。
如果需要示例数据,我可以提供,但坦率地说,只需在Json Property名称中添加Dash(-),您就可以简单地了解我的情况。
第页。S: 我无法更改Json本身,因为它是从API消耗的。
您可以使用ContractResolver
来操作JSON的方式。Net将C#属性名称映射为JSON名称。
对于你的例子,这个代码做到了:
class DashContractResolver : Newtonsoft.Json.Serialization.DefaultContractResolver
{
protected override string ResolvePropertyName(string propertyName)
{
// Count capital letters
int upperCount = propertyName.Skip(1).Count(x => char.IsUpper(x));
// Create character array for new name
char[] newName = new char[propertyName.Length + upperCount];
// Copy over the first character
newName[0] = char.ToLowerInvariant(propertyName[0]);
// Fill the character, and an extra dash for every upper letter
int iChar = 1;
for (int iProperty = 1; iProperty < propertyName.Length; iProperty++)
{
if (char.IsUpper(propertyName[iProperty]))
{
// Insert dash and then lower-cased char
newName[iChar++] = '-';
newName[iChar++] = char.ToLowerInvariant(propertyName[iProperty]);
}
else
newName[iChar++] = propertyName[iProperty];
}
return new string(newName, 0, iChar);
}
}
class Program
{
static void Main(string[] args)
{
string json = @"{""text-example"":""hello""}";
var anonymous = new { textExample = "" };
var obj = JsonConvert.DeserializeAnonymousType(json, anonymous,
new JsonSerializerSettings
{
ContractResolver = new DashContractResolver()
});
}
}
它将UpperCamelCase
和lowerCamelCase
转换为lower-dash-case
。因此,映射到您的JSON输入。
DeserializeAnonymousType
的此重载并不总是可用的,在Visual Studio 2013发布的版本中也不可用。当前(稳定的)NuGet包中有此过载。
我建议查看Json的动态UI,而不是匿名UI。Net,它可以将您的数据取消序列化为ExpandoObject,这是一种动态类型,其行为类似于字典,即类似于JavaScript对象。这意味着允许的属性名称的范围会增加,因为它们变成了字典键,而不是。净资产。
有点像:使用JSON将属性反序列化为ExpandoObject。NET