栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

在C#中反序列化具有int作为键的JSON

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

在C#中反序列化具有int作为键的JSON

正确映射数据类型:

可以反序列化JSON。正确识别后,您可以反序列化为

Dictionary<int, Merchant>

但是您需要将您

products
Merchant
类中的定义更改为
Dictionary<int,Product>
。这里需要一个字典来处理您的数字键。
List<Product>
将无法正常工作。

同样,要处理该

88x31
属性,您可以使用
DataMember(Name ='88x31')
映射将其映射到c#喜欢的东西
image88x31
。不幸的是,这确实意味着您的DTO属性将变为选择加入状态,因此您需要装饰所有成员。
using System.Runtime.Serialization;

一旦进行了以下更改:

// Note I capitalized Productpublic class Product{    public string status { get; set; }    public string type { get; set; }    public string pre { get; set; }    public string end_date { get; set; }    public string title { get; set; }    public string url { get; set; }    public string text { get; set; }    public string long_title { get; set; }}[DataContract]public class Merchant{    [DataMember]    public string category { get; set; }    [DataMember]    public List<string> country_whitelist { get; set; }    [DataMember]    public string name { get; set; }    [DataMember]    public List<string> url_blacklist { get; set; }    [DataMember]    public List<string> country_blacklist { get; set; }    [DataMember]    public List<string> url_whitelist { get; set; }    [DataMember]    public Dictionary<int, Product>  products { get; set; }    [DataMember]    public string sub_category { get; set; }    // This maps the 88x31 key to a c# appropriate name    [DataMember(Name = "88x31")]    public string image88x31 { get; set; }}

然后,您将可以反序列化为

Dictionary<int, Merchant>
没有任何问题。

JsonSerializer.DeserializeFromString<Dictionary<int, Merchant>>("YOUR JSON STRING");

在ServiceStack服务中使用:

如果您希望能够将此请求直接发送到ServiceStack服务,则可以使用将

RequestBinder
其反序列化为这种复杂类型。鉴于此服务:

要求DTO:

[Route("/Merchants", "POST")]public class MerchantsRequest{    public Dictionary<int, Merchant> MainMerchants { get; set; }}

简单操作方法:

public class MerchantsService : Service{    public void Post(MerchantsRequest request)    {        var merchant39 = request.MainMerchants.First(p=>p.Key == 39).Value;        Console.WriteLine("Name: {0}nImage: {1}nProduct Count: {2}", merchant39.name, merchant39.image88x31, merchant39.products.Count);        var merchant40 = request.MainMerchants.First(p=>p.Key == 40).Value;        Console.WriteLine("Name: {0}nImage: {1}nProduct Count: {2}", merchant40.name, merchant40.image88x31, merchant40.products.Count);    }}

AppHost配置:

在您的

AppHost
Configure
方法中,您需要将绑定器添加到请求类型。即
typeof(MerchantsRequest)
像这样:

public override void Configure(Funq.Container container){    Func<IRequest, object> merchantsRequestBinder = delegate(IRequest request) {        var json = WebUtility.HtmlDepre( request.GetRawBody() );        return new MerchantsRequest { MainMerchants = JsonSerializer.DeserializeFromString<Dictionary<int, Merchant>>(json) };    };    RequestBinders.Add(typeof(MerchantsRequest), merchantsRequestBinder);    ...}

这个资料夹方法会将您传送的json转换成

MerchantsRequest
。然后,您可以像常规ServiceStack请求一样使用它。

完整源代码在这里

控制台应用程序的一个完整工作示例,演示了将复杂JSON转换为服务请求的过程。


注意:
我在您的JSON中注意到您

deals
在一个对象上具有属性,而
products
在另一个对象上,我认为这是一个错字,因为您在的类中没有相应的属性
deals



转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/430785.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号