如何NodaTime.LocalDateTime使用ServiceStack.Text 控制自定义类型(例如)的序列化/反序列化?
Json.NET Converters 为此提供了这一功能,因此每次类包含自定义类型时,都将使用相应的自定义序列化器/反序列化器.例如,可以使用自定义方法将字符串NodaTime.LocalDateTime的属性转换为字符串.
在db4o中,IObjectConstructor将作为类似的转换层在保持类型之前将类型转换为另一个类型(LocalDateTime可以转换为DateTime).
我正在使用ServiceStack.Text将 json 反序列化为动态对象。
我在尝试反序列化以下 json 时遇到错误:
{
"responseHeader":{
"status":0,
"QTime":3,
"params":{
"q":"*:*",
"indent":"true",
"wt":"json"}},
"response":{"numFound":1,"start":0,"docs":[
{
"id":"1",
"title":["test"],
"_version_":1480260331707039744}]
}}
Run Code Online (Sandbox Code Playgroud)
上面的 json 是一个字符串,这就是我尝试反序列化它的方式:
DynamicJson dyn = DynamicJson.Deserialize(json);
var response = dyn.response;
Run Code Online (Sandbox Code Playgroud)
但我收到一条错误消息:dyn 不包含“响应”的定义
dynServiceStack.DynamicJson确实返回具有以下值的类型(来自调试器):
{"response_header":"{\n \"status\":0,\n \"QTime\":0,\n \"params\":{\n \"q\":\"*:*\",\n \"size\":\"0\",\n \"indent\":\"True\",\n \"start\":\"0\",\n \"wt\":\"json\",\n \"return-fields\":\"\"}}","response":"{\"numFound\":1,\"start\":0,\"docs\":[\n {\n \"id\":\"1\",\n \"title\":[\"test\"],\n \"_version_\":1480260331707039744}]\n }"} ServiceStack.DynamicJson
Run Code Online (Sandbox Code Playgroud)
根据这里的答案:Using ServiceStack.Text to deserialize a json string to object这就是它的完成方式,但我在这里做错了什么?
我正在使用ServiceStack来运行REST API,并且遇到了序列化响应对象的问题.更具体地说,当我调用JsonSerializer.SerializeToString(.)响应对象时,所有属性名称都以小写形式序列化.我试过摆弄params,JsConfig.EmitCamelCaseNames但这没有用.有任何想法吗?
请参阅下面的ServiceStack版本信息和屏幕截图.
"ServiceStack.Core": "1.0.32",
"ServiceStack.Kestrel": "1.0.32",
Run Code Online (Sandbox Code Playgroud)
我相信这是针对dotnet核心的,因为这本来是一个.NET应用程序,我已经迁移到dotnet核心.我之前的应用程序版本中从未见过这个问题.我知道我可以使用本机序列化器,但我认为ServiceStack速度更快(如果我错了请告诉我).
我有一个使用ServiceStack的项目; 我们运行旧的3.9.x代码库而不是升级到4.x,因为ServiceStack 4需要商业许可证.
我自己的API客户端在.nuspec文件中定义了依赖关系,如下所示:
<dependencies>
<dependency id="DotNetOpenAuth.OAuth2.Client" version="[4.3,5)" />
<dependency id="log4net" version="[2.0,2.1)" />
<dependency id="ServiceStack" version="[3.9.71,4)" />
</dependencies>
Run Code Online (Sandbox Code Playgroud)
问题是 - ServiceStack包依赖于ServiceStack框架的各个其他位,安装ServiceStack 3.9.71正在将ServiceStack.Text v4.0.24 安装到我的项目中.它确实弹出了需要许可证接受的对话框,这让我想到了一些奇怪的事情 - 但是没有为其他所需的ServiceStack组件手动定义我自己的依赖项,我怎样才能确保我不会结束在我的项目中使用未经许可的ServiceStack 4.x?
licensing nuget servicestack servicestack-text nuget-package-restore
我希望在向我的ServiceStack服务发送ajax请求时使用JSV而不是JSON来节省带宽.
我有以下JSON数据:
[{"201":"New York","022":"Chicago"}]
Run Code Online (Sandbox Code Playgroud)
我想将其转换为以下JSV格式:
[{201:New York,022:Chicago}]
Run Code Online (Sandbox Code Playgroud)
有办法简单地做到这一点吗?我不确定处理它的最佳方法是什么; 但根据我的知识/理解,我需要使用:(冒号)和,(逗号)拆分字符串,并需要循环它.但我担心这不会导致角色逃脱.是否有可用于解析JSV格式的官方JavaScript库 - 我找不到一个?
免责声明:我对ServiceStack很新
鉴于以下服务:
public class TestService : Service
{
public TestResponse Get(Test request)
{
if (String.IsNullOrEmpty(request.Message))
throw new ArgumentException("Message is required");
return new TestResponse();
}
}
Run Code Online (Sandbox Code Playgroud)
和以下请求/响应DTO:
[Route("/test", "GET")]
public class Test : IReturn<TestResponse>
{
public string Message { get; set; }
}
public class TestResponse
{
public IList<Test> TestList { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
当我尝试访问/测试时,我希望得到以下响应:
{
"responseStatus": {
"errorCode": "ArgumentException",
"message": "Message is required",
"errors": []
}
}
Run Code Online (Sandbox Code Playgroud)
相反,我得到一个空的JSON响应.然而,它返回正确的状态代码(400 Bad Request).
我认为在ServiceStack中使用Something然后SomethingResponse以这种方式命名您的DTO是很常见的.为了让它将异常作为序列化的ResponseStatus对象返回,我发现我可以将我的请求DTO从Test重命名为TestRequest和/或在我的响应DTO中包含ResponseStatus属性.
这是预期的行为吗?
更新
我应该包括只有在我的响应DTO的名称以Response结尾(区分大小写)时才会出现问题.如果我的请求/响应DTO分别被称为Foo和Bar,我会收到错误的格式正确的JSON响应.
尝试从序列化期间排除模型中的属性.
我使用以下语法:
JsConfig<MyTestClass>.ExcludePropertyNames = new[] { "ShortDescription" };
Run Code Online (Sandbox Code Playgroud)
就在那之后,我有以下内容:
return (from o in __someProvider.GetAll() select (new
{
o.Name,
o.ShortDescription
o.InsertDate
}).TranslateTo<MyTestClass>()).ToList()
Run Code Online (Sandbox Code Playgroud)
但是,一旦从方法返回结果,它仍然包含Json中的"ShortDescription"字段.难道我做错了什么?
下面的代码片段复制了我在ServiceStack应用程序中遇到的反序列化问题.在运行以下内容时,收件人属性正确填充但id不是.
static void Main (string[] args)
{
string json = "{\"@id\":\"abcd\",\"consignee\":\"mr mann\"}";
shipment some_shipment = new shipment();
some_shipment = json.FromJson<shipment>();
Console.Read();
}
class shipment
{
public string id { get; set; }
public string consignee { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
生成JSON的库为一些带有@的元素添加前缀,表示它们来自XML属性,但是这个程序是我无法控制的.我知道ServiceStack名称在JSON和对象属性之间匹配.
我试过将@附加到属性名称,但这没有帮助.
//doesn't help
public string @id { get; set;}
Run Code Online (Sandbox Code Playgroud)
有没有办法告诉ServiceStack将@id反序列化为id而不通过实现自定义反序列化器的过程?
我正在使用 Servicestack.text CSV 序列化程序将对象序列化为 CSV 格式。这是我尝试的方法
CsvSerializer.SerializeToString(MyObject)
Run Code Online (Sandbox Code Playgroud)
但它会转换为 CSV,包括这样的标题
ID、姓名、年龄\r\n13、Alex、45
但我不需要这些标题。有什么办法可以排除标题
我想知道为什么不需要构造函数将json字符串反序列化为.Net / C#类对象实例。令我惊讶的是,根本没有调用构造函数并将其删除,并且反序列化器仍从json字符串创建了一个对象实例。这正常吗?
(我使用ServiceStack的json序列化器)
我想知道反序列化时传入的 DTO 中的字符串值是否有任何选项可以“修剪”和“如果为空则设置为空”?我有很多字符串属性需要执行此操作,因此在每个属性的过滤器中手动执行此操作似乎太乏味了...
servicestack ×10
c# ×7
json ×2
.net-core ×1
asp.net ×1
asp.net-mvc ×1
constructor ×1
dto ×1
javascript ×1
licensing ×1
nodatime ×1
nuget ×1