Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/json/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
确保json键在.NET中是小写的_.net_Json_Json.net - Fatal编程技术网

确保json键在.NET中是小写的

确保json键在.NET中是小写的,.net,json,json.net,.net,Json,Json.net,有没有简单的方法在.NET中使用JSON来确保键以小写形式发送 目前,我正在使用newtonsoft的Json.NET库,并简单地使用 string loginRequest = JsonConvert.SerializeObject(auth); 在本例中,auth只是以下对象 public class Authority { public string Username { get; set; } public string ApiToken { get; set; } }

有没有简单的方法在.NET中使用JSON来确保键以小写形式发送

目前,我正在使用newtonsoft的Json.NET库,并简单地使用

string loginRequest = JsonConvert.SerializeObject(auth);
在本例中,
auth
只是以下对象

public class Authority
{
    public string Username { get; set; }
    public string ApiToken { get; set; }
}
这导致

{"Username":"Mark","ApiToken":"xyzABC1234"}
是否有办法确保
用户名
apitoken
键以小写形式传递

当然,我不想简单地通过
String.ToLower()
运行它,因为
username
apitoken
的值大小写不一


我意识到我可以通过编程实现这一点,并手动创建JSON字符串,但我需要大约20个JSON数据字符串,我正在考虑是否可以节省一些时间。我想知道是否有任何已构建的库允许您强制使用小写字母创建密钥。

您可以为此创建自定义契约解析器。以下协定解析程序将所有密钥转换为小写:

public class LowercaseContractResolver : DefaultContractResolver
{
    protected override string ResolvePropertyName(string propertyName)
    {
        return propertyName.ToLower();
    }
}
用法:

var settings = new JsonSerializerSettings();
settings.ContractResolver = new LowercaseContractResolver();
var json = JsonConvert.SerializeObject(authority, Formatting.Indented, settings);
public class Authority
{
    [JsonProperty("userName")] // or [JsonProperty("username")]
    public string Username { get; set; }
    [JsonProperty("apiToken")] // or [JsonProperty("apitoken")]
    public string ApiToken { get; set; }
}

var json  = JsonConvert.SerializeObject(authority);
将导致:

{"username":"Mark","apitoken":"xyzABC1234"}

如果您总是希望使用<代码> LowercaseContractResolver < /C>系列化,请考虑将其封装在类中,以避免重复自己:

public class LowercaseJsonSerializer
{
    private static readonly JsonSerializerSettings Settings = new JsonSerializerSettings
    {
        ContractResolver = new LowercaseContractResolver()
    };

    public static string SerializeObject(object o)
    {
        return JsonConvert.SerializeObject(o, Formatting.Indented, Settings);
    }

    public class LowercaseContractResolver : DefaultContractResolver
    {
        protected override string ResolvePropertyName(string propertyName)
        {
            return propertyName.ToLower();
        }
    }
}
可以这样使用:

var json = LowercaseJsonSerializer.SerializeObject(new { Foo = "bar" });
// { "foo": "bar" }

ASP.NET MVC4/WebAPI
如果您使用的是ASP.NET MVC4/WebAPI,则可以使用默认包含的Newtonsoft.Json库中的
CamelCasePropertyNamesContractResolver

您可以使用“JsonProperty”:

protected void Application_Start() {
    JsonConfig.Configure();   
}

public static class JsonConfig
{
    public static void Configure(){
        var formatters = GlobalConfiguration.Configuration.Formatters;
        var jsonFormatter = formatters.JsonFormatter;
        var settings = jsonFormatter.SerializerSettings;

        settings.ContractResolver = new CamelCasePropertyNamesContractResolver();
    }
}
用法:

var settings = new JsonSerializerSettings();
settings.ContractResolver = new LowercaseContractResolver();
var json = JsonConvert.SerializeObject(authority, Formatting.Indented, settings);
public class Authority
{
    [JsonProperty("userName")] // or [JsonProperty("username")]
    public string Username { get; set; }
    [JsonProperty("apiToken")] // or [JsonProperty("apitoken")]
    public string ApiToken { get; set; }
}

var json  = JsonConvert.SerializeObject(authority);
在和更高版本中,可以通过使用自定义名称将所有属性名称转换为小写。此类提取用于将属性名称从协定解析程序重新映射到可设置的单独轻量级对象的算法逻辑。 这样做可以避免创建一个契约解析器,因此可以更容易地集成到已经有自己的契约解析器的框架中

定义
LowercaseNamingStrategy
,如下所示:

public class LowercaseNamingStrategy : NamingStrategy
{
    protected override string ResolvePropertyName(string name)
    {
        return name.ToLowerInvariant();
    }
}
var settings = new JsonSerializerSettings
{
    ContractResolver = new DefaultContractResolver { NamingStrategy = new LowercaseNamingStrategy() },
};
string loginRequest = JsonConvert.SerializeObject(auth, settings);
[JsonObject(NamingStrategyType = typeof(LowercaseNamingStrategy))]
public class Authority
{
    public string Username { get; set; }
    public string ApiToken { get; set; }
}
然后按如下方式序列化:

public class LowercaseNamingStrategy : NamingStrategy
{
    protected override string ResolvePropertyName(string name)
    {
        return name.ToLowerInvariant();
    }
}
var settings = new JsonSerializerSettings
{
    ContractResolver = new DefaultContractResolver { NamingStrategy = new LowercaseNamingStrategy() },
};
string loginRequest = JsonConvert.SerializeObject(auth, settings);
[JsonObject(NamingStrategyType = typeof(LowercaseNamingStrategy))]
public class Authority
{
    public string Username { get; set; }
    public string ApiToken { get; set; }
}
注释-

  • 使用可确保在所有地区生成相同的合同

  • 要控制重写的属性名、字典键和扩展数据名是否为小写,可以将或(Json.NET 10.0.1及更高版本)设置为
    true

  • 你可能想

  • 如果您无权访问框架中的序列化程序设置,则可以将
    NamingStrategy
    直接应用于对象,如下所示:

    public class LowercaseNamingStrategy : NamingStrategy
    {
        protected override string ResolvePropertyName(string name)
        {
            return name.ToLowerInvariant();
        }
    }
    
    var settings = new JsonSerializerSettings
    {
        ContractResolver = new DefaultContractResolver { NamingStrategy = new LowercaseNamingStrategy() },
    };
    string loginRequest = JsonConvert.SerializeObject(auth, settings);
    
    [JsonObject(NamingStrategyType = typeof(LowercaseNamingStrategy))]
    public class Authority
    {
        public string Username { get; set; }
        public string ApiToken { get; set; }
    }
    
  • 不要修改的
    NamingStrategy
    。此协定解析程序在其所有实例中全局共享类型信息,因此修改任何一个实例都可能产生意外的副作用


对我来说,我综合了其他一些答案,最后得出了这个结论

        return JsonConvert.SerializeObject(obj, Formatting.Indented, new JsonSerializerSettings
        {
            ContractResolver = new CamelCasePropertyNamesContractResolver()
        });

更接近于我所寻找的解决方案,因为我不想创建自己的

也许json序列化库提供了某种序列化属性,您可以使用这些属性来更改属性的json序列化名称?@tdammers,谢谢,我正在尝试找到一些可以做到这一点的方法,但迄今为止还没有成功。希望这里有人能指给我看。如果你的财产是由一个词组成的话,它会很有用。我有相反的问题。。。还有,有趣的是,你提到“用户名”是混合的。你的意思是“用户名”吗?不,仅仅是值需要保持混合状态,按键只是我需要触摸的。有什么合理的方法可以反过来做吗?对于反序列化?@Anzeo我自己没有尝试过这样做,在文档中也没有找到任何相关信息。解决方案是在您自己的类中包装JsonConvert.SerializeObject。请参阅我的更新。似乎,如果要指定异常,此自定义contractresolver不考虑JsonProperty属性。。。e、 g.[JsonProperty(“alternateName”)]仍然是小写的,或者还有其他方法吗?+1用于指出
CamelCasePropertyNamesContractResolver
。现在我发现
System.Net.Http.Formatting.JsonContractResolver
是WebAPI中的默认值,这个类是内部类。我以rewrite
JsonContractResolver
和camel case结束。有人报告这是public
CamelCasePropertyNamesContratResolver
不转换小写的属性,只转换第一个字符。