是否有简单的方法在.NET中使用JSON来确保密钥以小写形式发送?
目前我正在使用newtonsoft的Json.NET库并且只是使用
string loginRequest = JsonConvert.SerializeObject(auth);
Run Code Online (Sandbox Code Playgroud)
在这种情况下auth只是以下对象
public class Authority
{
public string Username { get; set; }
public string ApiToken { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
这导致了
{"Username":"Mark","ApiToken":"xyzABC1234"}
Run Code Online (Sandbox Code Playgroud)
有没有办法确保username和apitoken键以小写形式出现?
我不想简单地通过运行它String.ToLower(),当然,因为价值观username和apitoken是混合的情况.
我意识到我可以以编程方式执行此操作并手动创建JSON字符串,但我需要大约20个左右的JSON数据字符串,我看到我是否可以节省一些时间.我想知道是否有任何已经构建的库允许您强制使用小写来创建密钥.
我在项目中关注了Enum
public enum CameraAccessMethod
{
Manual = 0,
Panasonic = 1,
Axis = 2,
AirCam = 3
}
Run Code Online (Sandbox Code Playgroud)
我有一个对象,可以根据不同的场景序列化为json或XML,对象的属性之一是类型CameraAccessMethod.我遇到的问题是,当这个属性被序列化为XML时,它将给出枚举值的字符串表示(Manual,Panasonic,Axis,Aircam),但在JSON中它被序列化为数值(0,1,2,3).我怎样才能避免这种不一致?我也希望JSON序列化中的字符串.
我有 ac# 类,我正在尝试使用Newtonsoft.Json. 该属性是一个枚举类型,我希望该值被序列化为“枚举名称的小写版本”。有一个JsonConverterAttribute可用于在属性上指定它,也有一个预写的,StringEnumConverter但我需要CamelCaseNamingStrategy在该转换器上指定,但我无法计算出语法。
我试图将它分配给属性本身:
public class C
{
[JsonConverter(typeof(StringEnumConverter),NamingStrategy=typeof(CamelCaseNamingStrategy))]
public ChartType ChartType { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
我也尝试将它类似地添加到枚举类型本身:
[JsonConverter(typeof(StringEnumConverter),NamingStrategy=typeof(CamelCaseNamingStrategy))]
public enum ChartType { Pie, Bar }
Run Code Online (Sandbox Code Playgroud)
但是语法是错误的。我在Newtonsoft 文档中找不到任何此类示例。
所需的序列化将是:"ChartType":"pie"或"ChartType":"bar"
有任何想法吗?谢谢。
我有一个枚举:
public enum FilterOperator
{
[EnumMember(Value = "eq")]
Equals,
[EnumMember(Value = "gt")]
GreaterThan,
[EnumMember(Value = "lt")]
LessThan,
[EnumMember(Value = "in")]
In,
[EnumMember(Value = "like")]
Like
}
Run Code Online (Sandbox Code Playgroud)
以及包含枚举属性的类:
public class GridFilter
{
[JsonProperty("operator")]
[JsonConverter(typeof(StringEnumConverter))]
public FilterOperator Operator { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
该对象通过WebAPI操作传入,并按预期对“ like”和“ in”进行反序列化,但不适用于“ lg”或“ gt”。知道为什么吗?
更新:好吧,“喜欢”和“从事”工作的原因是它们与枚举名称匹配。将GreaterThan重命名为Gt(etc)是可行的。因此,真正的问题是为什么不使用StringEnumConverter?
我的 ViewModel 中有一个用于DateTimeOffset属性的自定义 JsonConverter。我有 100 多个 ViewModel。
public class ItemViewModel
{
public string Name { get; set; }
[JsonConverter(typeof(CustomDateTimeOffsetConverter))]
public DateTimeOffset DateCreated { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
如何将此属性应用于所有 DateTimeOffset 属性,而不将其添加到我的所有 ViewModel 中?
当我阅读此答案时,我以为我已经找到了解决方案,但是当我应用它时,CustomResolver 仅在父对象本身上触发,而不是在 DateTimeOffset 属性或任何属性上触发。
public class CustomResolver : DefaultContractResolver
{
protected override JsonObjectContract CreateObjectContract(Type objectType)
{
JsonObjectContract contract = base.CreateObjectContract(objectType);
if (objectType == typeof(DateTimeOffset))
{
contract.Converter = new CustomDateTimeOffsetConverter();
}
return contract;
}
}
Run Code Online (Sandbox Code Playgroud)
回顾一下,我已经完成了其他所有工作。如果我手动添加该[JsonConverter(typeof(CustomDateTimeOffsetConverter))]属性,那么我的应用程序就会像魅力一样工作。我只是问如何自动添加属性,而不是手动添加。
我有一个枚举:
public enum IdleDelayBreakMode
{
Repeat,
ShowNext
}
Run Code Online (Sandbox Code Playgroud)
我NewtonSoft.Json用来转换为包含该枚举类型的属性的json对象。将那个枚举值序列化为任意整数的最佳解决方案是什么?理想情况下,我想在下面的代码段中执行类似的操作,并且我想知道是否有内置的解决方案:
public enum IdleDelayBreakMode
{
[JsonValue(100)]
Repeat, // When serializing will be converted to 100
[JsonValue(200)]
ShowNext // When serializing will be converted to 200
}
Run Code Online (Sandbox Code Playgroud)