【发布时间】:2020-12-07 14:29:36
【问题描述】:
我正在使用 .net core 3.1 Web API。这是从外部 API 获取数据。以下是我的代码控制器部分
[HttpGet("transinfo/{id}")]
public Object GettransactionData(int id)
{
var result=_transaction.GettransactionDetails(id).Result;
List<PipeLineResponse> P = JsonConvert.DeserializeObject<List<PipeLineResponse>>(result.ToString());
PipeLineResponseObject P1 = new PipeLineResponseObject();
P1.data = P;
return P1;
}
而我的服务代码如下
public async Task<Object> GettransactionDetails(int id)
{
string request=//fetched from db
var stringContent = new StringContent(request);
Client = utilities.GetHttpClient();
string apiEndpoint=//External API URL
HttpResponseMessage httpResponseMessage = await Client.PostAsync(apiEndpoint, stringContent);
if (httpResponseMessage.IsSuccessStatusCode)
{
return await httpResponseMessage.Content.ReadAsAsync<Object>();
}
}
但我得到以下格式的结果(邮递员的回复)
{
"data": [
{
"Tranid": "34540d40-7db8-44c1-9a2a-5072c2d01756",
"fields": {
"Fields.10": "1001",
"Fields.11": "Test1",
"Fields.12": "Fixed1"
}
},
{
"Tranid": "145800f9-c4a5-4625-84d7-29af5e674a14",
"fields": {
"Fields.10": "1002",
"Fields.11": "Test2",
"Fields.12": "Fixed2"
}
}
]
}
但我需要以下格式的数据
{
"data": [
{
"TransactionID": "34540d40-7db8-44c1-9a2a-5072c2d01756",
"fieldsList": [
{
"fieldId": "10",
"fieldValue": "1001"
},
{
"fieldId": "11",
"fieldValue": "Test1"
},
{
"fieldId": "12",
"fieldValue": "Fixed1"
}
]
},
{
"TransactionID": "145800f9-c4a5-4625-84d7-29af5e674a14",
"fieldsList": [
{
"fieldId": "10",
"fieldValue": "1002"
},
{
"fieldId": "11",
"fieldValue": "Test2"
},
{
"fieldId": "12",
"fieldValue": "Fixed2"
}
]
}
]
}
我怎样才能做到这一点?可以使用 JObject 或 JArray 反序列化吗?请帮忙。 我试图创建以下模型类并尝试反序列化但没有得到预期的结果。
public class PipeLineResponse
{
public string TransactionID { get; set; }
public List<Dictionary<string, string>> fields { get; set; }
}
public class PipeLineResponseObject
{
public List<PipeLineResponse> data { get; set; }
}
如何以任何 DTO 或 Automapper 都可以使用的格式创建该 json?请帮我提供样品。
【问题讨论】:
-
您可以使用自定义解析 json 字符串来实现。但是,更简洁的方法可以创建所需结构的 ViewModel(对于您的情况,您可以拥有一个属性为
data类型为IEnumerable<T>的类,而T是内部对象的类型),map服务对您的视图模型的响应,并让默认序列化从那里接管。 -
@SaiGummaluri :我在创建类模型后尝试过,但对如何创建它感到困惑
-
试试这个json2csharp.com,只需粘贴你的json,它就会给你类结构
-
@AcAnanth - 您正在调用的服务的响应实际上将
fields作为一个对象返回,其中所有字段都捆绑在一起。但是,您所需的结构具有一组单独的字段。由于这种差异,您会遇到错误。一个出路可以是将您的响应捕获到中间DTO(这可以是您使用json2csharp获得的结构)。手动或使用AutoMapper之类的方法将此 DTO 映射到 ViewModel。您正在查看的要求是完全可行的。 -
@AcAnanth - 或者,如果您不想采用 DTO 路线,您可以利用
Newtonsoft.Json并使用LINQ To JSON:解析来自服务的响应并将其手动映射到 ViewModel。 newtonsoft.com/json/help/html/QueryingLINQtoJSON.htm
标签: c# .net json asp.net-web-api asp.net-core-webapi