JSON.Net、匿名类型和虚线



在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()
            });

    }
}

它将UpperCamelCaselowerCamelCase转换为lower-dash-case。因此,映射到您的JSON输入。

DeserializeAnonymousType的此重载并不总是可用的,在Visual Studio 2013发布的版本中也不可用。当前(稳定的)NuGet包中有此过载。

我建议查看Json的动态UI,而不是匿名UI。Net,它可以将您的数据取消序列化为ExpandoObject,这是一种动态类型,其行为类似于字典,即类似于JavaScript对象。这意味着允许的属性名称的范围会增加,因为它们变成了字典键,而不是。净资产。

有点像:使用JSON将属性反序列化为ExpandoObject。NET

相关内容

  • 没有找到相关文章

最新更新