Bru*_*uno 14 c# json asp.net-mvc-4 asp.net-web-api
我有一个定制的类,使用长ID.但是,当我使用ajax调用我的动作时,我的ID被截断并且它丢失了最后2个数字,因为在处理大数字时javascript失去了精度.我的解决方案是给我的javascript一个字符串,但ID必须在服务器端保持很长时间.
有没有办法将属性序列化为字符串?我正在寻找某种属性.
调节器
public class CustomersController : ApiController
{
public IEnumerable<CustomerEntity> Get()
{
yield return new CustomerEntity() { ID = 1306270928525862486, Name = "Test" };
}
}
Run Code Online (Sandbox Code Playgroud)
模型
public class CustomerEntity
{
public long ID { get; set; }
public string Name { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
JSON结果
[{"Name":"Test","ID":1306270928525862400}]
Run Code Online (Sandbox Code Playgroud)
Kir*_*lla 19
您可以创建自定义JsonConverter并将其应用于您的属性.
下面是一个例子(注意:我之前没有使用过这个api所以它可能会有更多改进,但是下面应该给你一个粗略的想法):
public class Person
{
[JsonConverter(typeof(IdToStringConverter))]
public long ID { get; set; }
public string Name { get; set; }
}
public class IdToStringConverter : JsonConverter
{
public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
{
JToken jt = JValue.ReadFrom(reader);
return jt.Value<long>();
}
public override bool CanConvert(Type objectType)
{
return typeof(System.Int64).Equals(objectType);
}
public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
{
serializer.Serialize(writer, value.ToString());
}
}
Run Code Online (Sandbox Code Playgroud)
Web API操作:
public Person Post([FromBody]Person person)
{
return person;
}
Run Code Online (Sandbox Code Playgroud)
请求:
POST http://asdfasdf/api/values HTTP/1.1
Host: servername:9095
Connection: Keep-Alive
Content-Type: application/json
Content-Length: 42
{"ID":"1306270928525862400","Name":"Mike"}
Run Code Online (Sandbox Code Playgroud)
响应:
HTTP/1.1 200 OK
Content-Length: 42
Content-Type: application/json; charset=utf-8
Server: Microsoft-HTTPAPI/2.0
Date: Fri, 28 Jun 2013 17:02:18 GMT
{"ID":"1306270928525862400","Name":"Mike"}
Run Code Online (Sandbox Code Playgroud)
编辑:
如果您不想使用属性装饰属性,则可以将其添加到Converters集合中.例:
config.Formatters.JsonFormatter.SerializerSettings.Converters.Add(new IdToStringConverter());
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
9271 次 |
| 最近记录: |