Подтвердить что ты не робот

Случай верблюда по умолчанию верблюдов в сериализации JSON

У меня есть куча классов, которые в какой-то момент будут сериализованы в JSON и для того, чтобы следовать как соглашениям С# на внутренних и JavaScript-соглашениях на интерфейсе, я определял такие свойства:

[JsonProperty(PropertyName="myFoo")]
public int MyFoo { get; set; }

Так что в С# я могу:

MyFoo = 10;

И в Javascript я могу:

if (myFoo === 10)

Но делать это для каждого свойства является утомительным. Есть ли простой и простой способ установить способ по умолчанию JSON.Net обрабатывает имена свойств, чтобы он автоматически вернул себе дело, если не указано иное?

4b9b3361

Ответ 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, он будет использовать эту функцию для создания настроек.