Случай верблюда по умолчанию верблюдов в сериализации JSON
У меня есть куча классов, которые в какой-то момент будут сериализованы в JSON и для того, чтобы следовать как соглашениям С# на внутренних и JavaScript-соглашениях на интерфейсе, я определял такие свойства:
[JsonProperty(PropertyName="myFoo")]
public int MyFoo { get; set; }
Так что в С# я могу:
MyFoo = 10;
И в Javascript я могу:
if (myFoo === 10)
Но делать это для каждого свойства является утомительным. Есть ли простой и простой способ установить способ по умолчанию JSON.Net обрабатывает имена свойств, чтобы он автоматически вернул себе дело, если не указано иное?
Ответы
Ответ 1
Вы можете использовать предоставленный класс Newtonsoft.Json.Serialization.CamelCasePropertyNamesContractResolver:
var serializer = new JsonSerializer
{
ContractResolver = new CamelCasePropertyNamesContractResolver()
};
var jobj = JObject.FromObject(request, serializer);
Другими словами, вам не нужно самостоятельно создавать собственный распознаватель.
Ответ 2
При сериализации вашего объекта выполните некоторые пользовательские настройки.
var settings = new JsonSerializerSettings
{
ContractResolver = new CamelCasePropertyNamesContractResolver()
};
var json = JsonConvert.SerializeObject(yourObject, settings);
Ответ 3
Вы можете использовать пользовательский контрактный преобразователь:
class MyContractResolver : DefaultContractResolver
{
protected override IList<JsonProperty> CreateProperties(Type type, MemberSerialization memberSerialization)
{
var properties = base.CreateProperties(type, memberSerialization);
foreach (var property in properties)
{
property.PropertyName = char.ToLower(property.PropertyName[0]) + string.Join("", property.PropertyName.Skip(1));
}
return properties;
}
}
И используйте его как:
class MyClass
{
public int MyProperty { get; set; }
public int MyProperty2 { get; set; }
}
var json = JsonConvert.SerializeObject(new MyClass(),
Formatting.Indented,
new JsonSerializerSettings { ContractResolver = new MyContractResolver() });
Ответ 4
Поскольку принятый ответ - только для ссылок, я добавляю фактический код, который я использовал (в случае, если ссылка замирает). Это в значительной степени то же, что и в ссылке:
// Automatic camel casing because I'm bored of putting [JsonProperty] on everything
// See: http://harald-muehlhoff.de/post/2013/05/10/Automatic-camelCase-naming-with-JsonNET-and-Microsoft-Web-API.aspx#.Uv43fvldWCl
public class CamelCase : CamelCasePropertyNamesContractResolver
{
protected override JsonProperty CreateProperty(MemberInfo member,
MemberSerialization memberSerialization)
{
var res = base.CreateProperty(member, memberSerialization);
var attrs = member.GetCustomAttributes(typeof(JsonPropertyAttribute), true);
if (attrs.Any())
{
var attr = (attrs[0] as JsonPropertyAttribute);
if (res.PropertyName != null && attr.PropertyName != null)
res.PropertyName = attr.PropertyName;
}
return res;
}
}
Единственное изменение, которое я сделал, это добавление attr.PropertyName != null
в предложение if из-за того случая, когда я добавил что-то вроде:
[JsonProperty(NullValueHandling = NullValueHandling.Ignore)]
public string SomeProperty { get; set; }
И не хотел указывать PropertyName
(так что это null). Вышеуказанное будет сериализовано в JSON как someProperty
.
Ответ 5
JObject.FromObject
использует настройки по умолчанию из JsonConvert
по умолчанию.
Существует свойство func, которое вы можете назначить следующим образом:
JsonConvert.DefaultSettings = () => new JsonSerializerSettings()
{
ContractResolver = new CamelCasePropertyNamesContractResolver()
};
и всякий раз, когда вы вызываете JObject.FromObject
, он будет использовать эту функцию для создания настроек.