3

我正在创建一个复杂的对象,其中包含要从我的 web api 控制器返回的子对象(嵌套对象)。该对象包含其他对象类型的列表。列表中的这些子对象类型遵循 .NET 中使用的帕斯卡大小写。

var persons = peopleLookup.Values;
var users = userLookup.Values;
var roles = rolesLookup.Values;
var groups = groupLookup.Values;
var roleAssignments = roleAssignmentLookup.Values;
var groupMembers = groupMemberLookup.Values;
return new { persons, users, roles, roleAssignments, groups, groupMembers };

我的问题是 WebAPI 不会对子项目的每个属性进行驼峰式大小写。例如,persons 列表中的第一个人应该具有 id、name 的属性,而不是 .NET pascal 大小写的 Id、Name。这同样适用于所有其他子项目。

4

4 回答 4

6

您可以配置 JSON.NET 以在应用程序启动时生成驼峰式名称。Scott Allen 帖子中的代码片段:

var formatters = GlobalConfiguration.Configuration.Formatters;
var jsonFormatter = formatters.JsonFormatter;
var settings = jsonFormatter.SerializerSettings;
settings.Formatting = Formatting.Indented;
settings.ContractResolver = new CamelCasePropertyNamesContractResolver();
于 2014-04-29T19:10:12.757 回答
1

我有同样的问题。我正在返回一个用于网格填充的对象。它有一些属性,如行、页面、总计等。将合同解析器设置为骆驼案例可以解决顶层属性的问题。但是,如果任何属性包含具有帕斯卡大小写属性名称的对象列表,它不会改变它们的大小写。

所以这就是我为解决这个问题所做的工作。

带有要返回的数据的网格对象

[DataContract]
public class GridProperties<T>
{
    [DataMember]
    public List<T> Rows { get; set; }

    [DataMember]
    public int Records { get; set; }

    [DataMember]
    public int Total { get; set; }

    [DataMember]
    public int Page { get; set; }
}

这里 Rows 保存对象列表。在这里,我返回了模型对象列表。模型类看起来像:

public class ClientListModel
{
    [DataMember(Name = "clientId")]
    public int ClientId { get; set; }

    [DataMember(Name = "firstName")]
    public string FirstName { get; set; }

    [DataMember(Name = "lastName")]
    public string LastName { get; set; }

    [DataMember(Name = "startDate")]
    public DateTime? StartDate { get; set; }

    [DataMember(Name = "status")]
    public string Status { get; set; }

    public ClientListModel()
    {}
}

下面是我如何从我的 API 控制器返回 JSON 数据

    [HttpGet]
    public GridProperties<ClientListModel> GetClients(int page)
    {
        const int rowsToDisplay = 10;
        try
        {
            IEnumerable<ClientListModel> clientList = null;

            using (var context = new AngularModelConnection())
            {
                clientList = context.Clients.Select(i => new ClientListModel()
                {
                    ClientId = i.Id,
                    FirstName = i.FirstName,
                    LastName = i.LastName,
                    StartDate = i.StartDate,
                    Status = (i.DischargeDate == null || i.DischargeDate > DateTime.Now) ? "Active" : "Discharged"
                    });

                    int total = clientList.Count(); //Get count of total records
                    int totalPages = Convert.ToInt16(Math.Ceiling((decimal) total/rowsToDisplay)); //Get total page of records

                    return new GridProperties<ClientListModel>
                    {
                        Rows = clientList.Skip((page - 1)*rows).Take(rows).ToList(),
                        Records = total,
                        Total = totalPages,
                        Page = page
                    };
                }
            }
            catch (Exception exc)
            {
                ExceptionLogger.LogException(exc);
                return new GridProperties<ClientListModel>
                {
                    Rows = null,
                    Records = 0,
                    Total = 0,
                    Page = page
                };
            }
        }

[DataMember(Name ="")]属性指定当对象被序列化时该属性使用什么名称。

希望这可以帮助!

于 2014-12-18T08:08:15.137 回答
0

在尝试从 WebAPI 返回具有关系的 DataSet 时,我遇到了嵌套对象的类似问题。使用ExpandoObject对我有用的技巧,也许这会对你有所帮助。

private static object ConvertDataSetWithRelationsToCamelCaseObject(DataSet ds)
        {
            foreach (DataRelation relation in ds.Relations)
            {
                relation.Nested = true;
            }

            var doc = new XmlDocument();
            doc.LoadXml(ds.GetXml());
            var pascalCaseJson = JsonConvert.SerializeXmlNode(doc, Formatting.None, true);
            var pascalCaseObject = JsonConvert.DeserializeObject<ExpandoObject>(pascalCaseJson);
            var camelCaseJson = JsonConvert.SerializeObject(pascalCaseObject, Formatting.Indented,
                new JsonSerializerSettings {ContractResolver = new CamelCasePropertyNamesContractResolver(),});
            return JsonConvert.DeserializeObject(camelCaseJson);
        }

用于创建具有关系的数据集的示例代码:

var dsTasks = new Tasks().Find(sqlParameters);
var dsValidators = new Validators().Find(sqlParameters);
var dsProperties = new ValidatorProperties().Find(sqlParameters);

dsTasks.Tables[0].TableName = "Tasks";
dsValidators.Tables[0].TableName = "Validators";
dsProperties.Tables[0].TableName = "ValidatorProperties";

var ds = new DataSet {DataSetName = "ValidatorsByTask"};
ds.Tables.Add(dsTasks.Tables[0].Copy());
ds.Tables.Add(dsValidators.Tables[0].Copy());
ds.Tables.Add(dsProperties.Tables[0].Copy());

ds.Relations.Add("Task_Validators", ds.Tables["Tasks"].Columns["Id"], ds.Tables["Validators"].Columns["TaskId"]);
ds.Relations.Add("Validator_Properties", ds.Tables["Validators"].Columns["Id"], ds.Tables["ValidatorProperties"].Columns["ValidatorId"]);

var data = ConvertDataSetWithRelationsToCamelCaseObject(ds);
于 2014-08-15T16:21:59.500 回答
-2

在 CamelCase 与默认的 .NET 的 PascalCase 中格式化 JSON 输出的一个简短且非常简单的解决方案。

将以下两行添加到您的 WebApiConfig.cs 文件(在 WebApi 2 的 App_Start 文件夹下):

// Get the default json formatter 
var jsonFormatter = config.Formatters.OfType<JsonMediaTypeFormatter>().First();

// Switch from PascalCase to CamelCase
jsonFormatter.SerializerSettings.ContractResolver = new CamelCasePropertyNamesContractResolver();
于 2015-03-18T04:37:29.837 回答