C# CamelCase JSON WebAPI子对象(嵌套对象、子对象)
我正在创建一个复杂对象,其中包含要从web api控制器返回的子对象(嵌套对象)。该对象包含其他对象类型的列表。列表中的这些子对象类型遵循.NET中使用的pascal大小写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
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();