【问题标题】:How to serialize object to JSON using DataAnnotation to format double property using ServiceStack request如何使用 DataAnnotation 将对象序列化为 JSON 以使用 ServiceStack 请求格式化双属性
【发布时间】:2016-03-29 21:58:36
【问题描述】:

使用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

如何强制ServiceStack0.0 格式保留JSON 请求?

【问题讨论】:

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


    【解决方案1】:

    您可以指定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}
    

    【讨论】:

    • 你又一次帮了我很多忙!谢谢,我很感激!
    【解决方案2】:

    你试过用Json.Net吗?

    双打将自动转换为#.# 格式,并且还有骆驼大小写属性名称解析器:

    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}}
    

    【讨论】:

    • 很好,你的建议在这里奏效了。然而,Mythz 为我提供了一种使用 ServiceStack 原生选项的流畅方式。
    • @RogerOliveira,不用担心。我真的不知道 ServiceStack 服务。希望它对其他人也有帮助^^。
    猜你喜欢
    • 2023-03-29
    • 1970-01-01
    • 1970-01-01
    • 2017-10-12
    • 2019-03-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多