我在使用ServiceStack的DataContract API +*ServiceClient从标准XML/JSON REST服务中获取适当的反序列化时遇到了一些麻烦.例如,如果我们采用以下输出(使用accept header来获取json):
http://rxnav.nlm.nih.gov/REST/RxTerms/rxcui/198440/allinfo
你将如何构建一个模型对象来处理JSON输出和从该服务获取XML输出(使用accept头来获取json)?
您是否需要在DataContract和DataMember属性中提供显式的"Name"参数才能获得适当的反序列化?
ServiceStack如何将XML/JSON对象名称与模型中的属性名称进行比较?他们是否区分大小写?
我们可以在JsonRestClientAsync中获得某种通用的Func委托API,以无缝地集成我们自己的反序列化机制,我们有第三方格式来处理吗?
是的我知道我可以使用ServiceStack.Text进行显式反序列化.我在所有的.NET项目中都非常依赖这种依赖:-)
谢谢,
Anuj
我试图将以下JSON表示反序列化为强类型对象.我可以从c# - > json序列化它,但反之亦然.
C#
public class Package
{
public Guid Id {get;set;}
public List<string> Email {get;set;}
public List<Items> Items {get;set;}
}
public class Items
{
public string Uri {get;set;}
public int Width {get;set;}
public int Height {get;set;}
}
Run Code Online (Sandbox Code Playgroud)
JSON
{
"Id":"84fd8751-6107-41af-9473-65aae51e042a",
"Email":[
"j@t.com"
],
"Items":"[
{"Uri":"http://localhost/foo.jpg","Width":234,"Height":313},
{"Uri":"http://localhost/bar.jpg","Width":234,"Height":174}]"
}
Run Code Online (Sandbox Code Playgroud)
用于反序列化的代码
var instance = JsonSerializer.DeserializeFromString<Package>(jsonData);
Run Code Online (Sandbox Code Playgroud)
instance创建了对象,并且有2个项目对象,instance.Items但它们的所有属性都为null.
TIA
我们有一些请求过滤器,也使用验证功能.
[AttributeUsage(AttributeTargets.Method, Inherited = true)]
public class MyFilterAttribute : Attribute, IHasRequestFilter
{
...
}
Run Code Online (Sandbox Code Playgroud)
在AppHost中:
public override void Configure(Container container)
{
....
Plugins.Add(new ValidationFeature());
....
}
Run Code Online (Sandbox Code Playgroud)
我需要在请求过滤器之后运行流畅的验证,因为一些过滤器会将数据添加到dto然后进行验证.我已经看到了操作顺序但是没有说明验证的位置......至少我没有看到.
任何帮助,将不胜感激.
我有必要向ServiceStack的JsonServiceClient.Get提供IReturn或IReturnVoid引用吗?必须有一个很好的理由(我对框架很新)但我不明白为什么我必须将我的对象转换为IReturn包装器或使它们依赖于ServiceStack.
我已阅读这些帖子,但找不到我正在寻找的解释(仅解决方法):
谢谢!
我使用ServiceStack.在我的C#DTO中,我有一个属性
public DateTime Created { get; set; }
Run Code Online (Sandbox Code Playgroud)
使用TypeLITE http://type.litesolutions.net/映射到TypeScript
interface Instance {
Created: Date;
Run Code Online (Sandbox Code Playgroud)
但是,由于我不想通过API发送JavaScript特定的日期格式,因此我使用此ServiceStack设置使用ISO日期
JsConfig.DateHandler = JsonDateHandler.ISO8601;
Run Code Online (Sandbox Code Playgroud)
所以,我在这里不匹配.一种解决方案是使用Typescript类
interface Instance {
Created: string;
Run Code Online (Sandbox Code Playgroud)
并在使用时解析日期.我在哪里调用Date.parse('iso-date-string')?雄心勃勃的解决方案是两次使用TypeScript类,一个使用字符串,另一个使用Date.
为了使TypeLITE生成字符串而不是DateTime日期,我该怎么办?
类的数量相当小,所以我可以手动修复它们.但是,我的想法是,我将有一个特殊的API调用,客户端可以下载TypeScript声明,然后,一个完整的自动TypeLITE会更好.
我们有一个访问servicestack REST服务的Icneium Hybrid Mobile应用程序.可以在Node.js而不是IIS上托管servicestack吗?任何例子都非常感谢.
我的服务器正在使用ServiceStack,并希望收到一些这样的数据:
{
Customer: {
Company: "TheCompany",
RegionCode: "AU_NSW"
},
Name: {
First: "Jimi",
Last: "Hendrix"
}
}
Run Code Online (Sandbox Code Playgroud)
我有一个包含这些字段的表单,我可以使用JQuery轻松获取数据,创建嵌套的JSON对象并使用$ .post发送它.
但我不想将其作为AJAX发送,因为我希望整个页面都提交,然后浏览器将服务器的响应显示为新页面.只是经典的表单帖子行为.
我已经尝试将复杂的json作为字符串嵌入隐藏的表单字段中 - 没有雪茄.
我还查看了ServiceStack是否有任何命名约定,以便我可以调用我的表单字段"Name [First]"并让ServiceStack将正确的值放在正确的嵌套结构中 - 也就是没有雪茄.
我使用带有Route anotation的RequestClass来调用Json-Client POST方法.现在,虽然参数的结构是这样的
public class GetTicketRequest: IReturn<JsonObject>
{
public string CartId {
get;
set;
}
public string PriceId {
get;
set;
}
}
Run Code Online (Sandbox Code Playgroud)
BackendAPI需要它们在json请求中的"data"中,所以更像是
{
"data":[
{"cartid":123,
"priceId":11}]
}
Run Code Online (Sandbox Code Playgroud)
有没有办法在调用之前转换为body的请求对象
JsonServiceClient _restClient = new JsonServiceClient(baseUrl);
JsonObject oneResponse = _restClient.Post(options);
Run Code Online (Sandbox Code Playgroud) 下面的代码片段复制了我在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会话中ss-id和ss-pid有什么区别?