C#将数据库中的JSONObject拆分为两个对象



我正在使用ASP开发一个restful api。NET MVC。我需要返回一个JSON响应,其结构如下:

{
"config": {
"type": "custom",
"name": "Deals and Offers",
"template": "customTextImageActionCard1"
},
"cardContent": [{
"display": {
"primaryMessage": "",
"primaryButton": "FIND FLIGHTS",
"dismissButton": "Dismiss"
},
"action": {
"pageId": "webview",
"customLink": "<Any required url>",
"params": []
}
},
{
"display": { 
"priority": "2",
"cardId": "18032003",
"title": "Ultimate Flexibility",

},
"action": {
"customLink": "",
"pageId": "browser",
"params": []
}
},...

这是我迄今为止写的代码:

public IHttpActionResult Post(string appCountry = null, string appLanguage = null)
{  
DealsEntities context = new DealsEntities();            
var data = new
{
type = "custom",
name = "Deals and Offers",
template = "customTextImageActionCard1"
};
return Ok(new { config = data, cardContent = context.cards.ToList() });      
}

我得到了这样的回应:

{
"config": {
"type": "custom",
"name": "Deals and Offers",
"template": ""
},
"cardContent": [
{
"primaryMessage": "",
"primaryButton": "",
"dismissButton": "Dismiss",
"pageId": "browser",
"customLink": "",
"params": null
},
{
"primaryMessage": ""Kota Kinabalu from MYR 179",
"primaryButton": "Book Now",
"dismissButton": "Dismiss",
"pageId": "webview",
"customLink": "",
"params": null
},...

卡片数据以行形式存储在数据库中。如何将卡片对象拆分为显示对象和操作对象?

您可以尝试使用一个结构。

public struct ApiData
{
public Config config;
public List<CardContent> cardContent;
}
public struct Config
{
public string type;
public string name;
public string template;
}
public struct CardContent
{
public Display display;
public Action action;
}
public struct Display
{
public string primaryMessage;
public string primaryButton;
public string dismissButton;
}
public struct Action
{
public string pageId;
public string customLink; 
public List<Params> @params; // You probably want to rename params since the compiler takes it as a keyword.
}
public struct Params
{
// Add whatever you want.
}

然后在代码中创建一个new ApiData()并分配值。

示例:

public static ApiData assign()
{
var data = new ApiData();
var config = new Config();
config.name = "";
config.template = "";
config.type = "";
var cardContent = new CardContent();
var action = new Action();
action.customLink = "";
cardContent.action = action;
data.config = config;
if (data.cardContent is null) data.cardContent = new List<CardContent>() { cardContent };
else
{
data.cardContent.Add(cardContent);
}
}

感谢大家的回复。我设法用下面的代码使它工作。我修改了我的模型,使其具有动作和显示属性

public partial class card
{
public string primaryMessage { get; set; }
public string primaryButton { get; set; }
public string dismissButton { get; set; }
public string pageId { get; set; }
public string customLink { get; set; }
public string @params { get; set; }
public string action { get; set; }
public string display { get; set; }
}

然后我将下面的代码添加到控制器方法中。

public IHttpActionResult Post(string appCountry = null, string appLanguage = null)
{
DealsEntities context = new DealsEntities();
IEnumerable<card> cards = context.cards;
var data2 = cards.Select(x => new 
{
display = new
{
cardId = x.cardId,
priority = x.priority,
title = x.title,
banner = x.banner,
primaryMessage = x.primaryMessage,
primaryButton = x.primaryButton,
dismissButton = x.dismissButton
},
action = new
{
page_id = x.pageId,
custom_link = x.customLink,
@params = x.@params
}
});          
var data = new
{
type = "custom",
name = "Deals and Offers",
template = "customTextImageActionCard1"
};
return Ok(new { config = data, cardContent = data2});
}

瞧。希望它将来能帮助到别人。

我建议创建一个。NET类型,包含您需要的所有内容。

然后用正确的对象构造该类型,并从API方法返回该类型。

最新更新