如何使用DataAnnotation将对象序列化为JSON,以使用ServiceStack请求格式化double属性

时间:2016-03-29 21:58:36

标签: c# json servicestack ormlite-servicestack servicestack-text

使用ServiceStack我需要格式化此请求,以便CodValue属性保持此格式#.#

[DataContract(Name = "request1")]
public class Request1
{
   [DataMember(Name = "codValue")]
   public double CodValue { get; set; }
}

var request1 = new Request1 { CodValue = 0.0 }
_serviceClientBase.Post(request1);

但是,当我发送请求时,服务器端会收到CodValue = 0 但由于服务器端为Java,因此会返回错误消息,指出它是Java.Lang.Long而不是Double

如何强制ServiceStack以[{1}}格式保留JSON请求?

2 个答案:

答案 0 :(得分:3)

您可以指定JsConfig<T>.RawSerializerFn附加任何缺失的.0后缀,例如:

JsConfig<double>.IncludeDefaultValue = true;
JsConfig<double>.RawSerializeFn = d =>
{
    var str = d.ToString(CultureInfo.InvariantCulture);
    return str.IndexOf('.') >= 0 ? str : str + ".0";
};

要打印所需的结果:

var dto = new Request1 { CodValue = 0.0 };

dto.ToJson().Print(); //= {"codValue":0.0}

答案 1 :(得分:1)

您是否尝试过使用Json.Net

双打将自动转换为#.#格式,并且还有Camel案例属性名称解析器:

using Newtonsoft.Json;
using Newtonsoft.Json.Serialization;

...

class Request1
{
    public double CodValue { get; set; }
}

...

var request = new {Request1 = new Request1()};
var json= JsonConvert.SerializeObject(request,
    new JsonSerializerSettings() {ContractResolver = new CamelCasePropertyNamesContractResolver()});

json字符串看起来像这样:

{"request1":{"codValue":0.0}}