asp.net 在Web API C#中获取特定字段的数据

0mkxixxg  于 12个月前  发布在  .NET
关注(0)|答案(1)|浏览(127)

我有一个JSON URI,我正在使用它作为数据源。我正在编写一个Web API,其中我需要检索用户输入的任何特定字段的数据。
问题是,我不知道如何使用“元素”字段,它只不过是用户输入的字段的名称来过滤JSON数据源。
例如,下面的JSON是我的数据源,我只需要获取table_no的数据。所以用户将输入字段table_no,响应应该只显示table_no的数据。

"data": [

    {

        "order": 1,
        "table_no": 94683,
        "table_book_date": "20240103100000",
    },
    
    {
        "order": 2,
        "table_no": 94544,
        "table_book_date": "20240103100000",
     }
    
    ]

字符串
我有一段C#代码,其中“element”是一个输入,可以是任何字段。这里是table_no,但不知道如何使用它来过滤我的JSON数据。

[HttpGet("[action]/{element}")]
 public async Task<IActionResult> Get(string element)
 {
     try
     {
         var restaurantData= await DeSerializeJsonData(element);
         return Ok(new RestaurantDataResponse()
         {
             RestaurantResponse = restaurantData.data
         }

             );
     }
     catch (HttpRequestException httpRequestException)
     {
         return BadRequest($"Error");
     }
 }
private async Task<RestaurantData> DeSerializeJsonData(string element)
{
    using (var client = new HttpClient())
    {
        var response = await client.GetFromJsonAsync<RestaurantData\>($"<json url>.json");
        return response;
    }
}


最后的React应该是这样的

{ "data": [ 
    { "table_no": 94683, }, 
    { "table_no": 94544, } 
] }

zfciruhq

zfciruhq1#

第一个问题是,如果你希望输出只是根据传入的“element”值从餐厅数据中筛选出的字段,那么你不会返回RestarauntData。因此,返回类型不能是静态类型,除非你喜欢属性的名称是静态的,比如“selectedValue”,可选地带有一个值名称来指示你筛选出的“element”:

{ "selectedValue": 94683, "valueName": "table_no" }
{ "selectedValue": 94684, "valueName": "table_no" }

字符串
像这样的spething可以通过为上面的数据声明一个类型来实现:

[Serializable]
public class FilteredData
{
    public object SelectedValue { get; set; }
    public string ValueName { get; set; }
}


.然后填充:

JObject data = JObject.Parse(json);
var result = data["data"].Select(x => new FilteredData { SelectedValue = x[element], ValueName = element }).ToList();
return result;


但是,如果你想返回JSON字符串,那么你可以让一个方法返回所需的JObject:

JObject data = JObject.Parse(json);
var result = data["data"].Select(x => new { __fieldName__ = x[element] }).ToList();
var jsonResult = JsonConvert.SerializeObject(result);
jsonResult = jsonResult.Replace("__fieldName__", element);

return jsonResult;


这将返回所需的:

[
    { "table_no": 94683, }, 
    { "table_no": 94544, } 
]


对于string.Replace来说,这是一个小技巧,因为Select需要一个常量字符串作为返回的字段名,我们使用一个占位符,然后在结果JSON中替换。如果你想要“data”标签为[]的容器数组,你可能需要调整返回。

相关问题