Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/266.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/json/15.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
C# CamelCase JSON WebAPI子对象(嵌套对象、子对象)_C#_Json_Asp.net Web Api_Camelcasing_Pascalcasing - Fatal编程技术网

C# CamelCase JSON WebAPI子对象(嵌套对象、子对象)

C# CamelCase JSON WebAPI子对象(嵌套对象、子对象),c#,json,asp.net-web-api,camelcasing,pascalcasing,C#,Json,Asp.net Web Api,Camelcasing,Pascalcasing,我正在创建一个复杂对象,其中包含要从web api控制器返回的子对象(嵌套对象)。该对象包含其他对象类型的列表。列表中的这些子对象类型遵循.NET中使用的pascal大小写 var persons = peopleLookup.Values; var users = userLookup.Values; var roles = rolesLookup.Values; var groups = groupLookup.Values; var roleAssignments = roleAssign

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

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的和属性,而不是id,name的.NET pascal大小写。这同样适用于所有其他子项。

您可以配置JSON.NET在应用程序启动时生成驼峰大小写名称。代码段来自:


在尝试从WebAPI返回具有关系的数据集时,我遇到了嵌套对象的类似问题。使用
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);
        }

我也有同样的问题。我返回一个网格填充对象。它有一些属性,如行、页、总计等。将合同解析器设置为camel case可以解决顶级属性的问题。但是,如果任何属性包含具有pascal大小写属性名称的对象列表,则不会更改其大小写

下面是我为解决这个问题所做的工作

要返回数据的网格对象

[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; }
}
下面是我如何从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
                };
            }
        }
[HttpGet]
公共网格属性GetClient(int页)
{
const int rowsToDisplay=10;
尝试
{
IEnumerable clientList=null;
使用(var context=new AngularModelConnection())
{
clientList=context.Clients.Select(i=>newclientlistmodel()
{
ClientId=i.Id,
FirstName=i.FirstName,
LastName=i.LastName,
StartDate=i.StartDate,
状态=(i.DischargeDate==null | | i.DischargeDate>DateTime.Now)?“活动”:“已出院”
});
int total=clientList.Count();//获取记录总数
int totalPages=Convert.ToInt16(Math.天花((十进制)total/rowsToDisplay));//获取记录的总页数
返回新的GridProperties
{
Rows=clientList.Skip((第-1页)*Rows.Take(Rows.ToList(),
记录=总数,
总计=总页数,
第页
};
}
}
捕获(异常exc)
{
例外日志记录器。日志例外(exc);
返回新的GridProperties
{
行=空,
记录=0,
总计=0,
第页
};
}
}
[DataMember(Name=”“)]
属性指定序列化对象时属性使用的名称

希望这有帮助

与默认的.NET的PascalCase相比,CamelCase提供了一个简短且非常简单的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();
//获取默认的json格式化程序
var jsonFormatter=config.Formatters.OfType().First();
//从PascalCase切换到CamelCase
jsonFormatter.SerializerSettings.ContractResolver=新的CamelCasePropertyNamesContractResolver();

我也有同样的问题。你明白了吗?
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()
    {}
}
    [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
                };
            }
        }
// Get the default json formatter 
var jsonFormatter = config.Formatters.OfType<JsonMediaTypeFormatter>().First();

// Switch from PascalCase to CamelCase
jsonFormatter.SerializerSettings.ContractResolver = new CamelCasePropertyNamesContractResolver();