내 API 컨트롤러 중 하나에 저장 방법과 결합 된 C # 웹 사이트 및 웹 API가 있습니다. 이 메서드는 HttpPosts 만 허용합니다. 내가 본문에 보내고 싶은 것은 List<int>
, List<decimal>
그리고 long
.
API 컨트롤러의 HttpPost 메서드는 하나의 매개 변수 만 작동하도록 허용하므로 a JObject
및 string
as 매개 변수를 모두 시도했습니다 . 문자열을 사용할 때는 항상 null이고 JObject를 사용할 때는 null이 아니지만 본문에서 잘못 복사되었습니다. 이들은 null이고 잘못 복사 되었기 때문에 List<int>
, List<decimal>
및 로의 변환 long
도 작동하지 않습니다.
매개 변수 (문자열) :
[HttpPost]
[AllowAnonymous]
[ActionName("save")]
public bool SaveOrders([FromBody] string jsonData)
{
// Convert jsonData string to List<int>, List<decimal>, long
JObject json = JObject.Parse(jsonData);
List<int> productIds = JsonConvert.DeserializeObject(json["productIds"].ToString(), typeof(List<int>));
List<decimal> prices = JsonConvert.DeserializeObject(json["prices"].ToString(), typeof(List<decimal>));
long dateInTicks = JsonConvert.DeserializeObject(json["dateInTicks"].ToString(), typeof(long));
...
}
POST 본체 포함 :
"{
"productIds": "[20, 25]",
"prices": "[0.40, 7.40]",
"dateInTicks": "1402444800"
}"
위에서 디버깅 할 때 parameter-string은 항상 null입니다.
JObject로서의 매개 변수 :
[HttpPost]
[AllowAnonymous]
[ActionName("save")]
public bool SaveOrders([FromBody] JObject jsonData)
{
// Convert jsonData JObject to List<int>, List<decimal>, long
dynamic json = jsonData;
string sProductIds = (string)json["productIds"];
string sPrices = (string)json["prices"];
string sDateInTicks = (string)json["dateInTicks"];
List<int> productIds = JsonConvert.DeserializeObject(sProductIds, typeof(List<int>));
List<decimal> prices = JsonConvert.DeserializeObject(sPrices, typeof(List<decimal>));
long dateInTicks = JsonConvert.DeserializeObject(sDateInTicks, typeof(long));
...
}
POST 본체 포함 :
productIds: "[20, 25]",
prices: "[0.40, 7.40]",
dateInTicks: "1402444800"
이것을 디버깅 할 때 매개 변수 -JObject는 다음과 같습니다.
{
"productIds: \"": {
"20, 25]\",\nprices: \"": {
"0.40, 7.40]\",\ndateInTicks: \"1402444800\"": ""
}
}
}
sProductIds, sPrices 및 sDateInTicks는 null입니다.
나는 내가 어떤 일을 잘못하고 있음을 알고 있으므로이 질문은 내가 그것을 어떻게 바꾸어야할지 모르기 때문입니다.
편집 1 (Rafal의 제안) :
내 구성 파일에서 한 줄을 추가했습니다.
// Only allow JSON response format
var json = config.Formatters.JsonFormatter;
json.SerializerSettings.PreserveReferencesHandling = Newtonsoft.Json.PreserveReferencesHandling.Objects;
config.Formatters.Remove(config.Formatters.XmlFormatter);
// Added the following line:
config.Formatters.JsonFormatter.SerializerSettings.ContractResolver = new CamelCasePropertyNamesContractResolver();
그리고 내 방법이 변경되었습니다.
[HttpPost]
[AllowAnonymous]
[ActionName("save")]
public bool SaveOrders([FromBody] Data jsonData)
{
if (jsonData != null)
{
if (jsonData.productIds != null && jsonData.prices != null)
{
return SavePrices(jsonData.productIds, jsonData.prices, jsonData.dateInTicks);
}
else
{
Console.WriteLine("One of the objects is null, so we can't continue.");
return false;
}
}
else
{
Console.WriteLine("The send data is null, so we can't continue.");
return false;
}
}
public class Data
{
public List<int> productIds { get; set; }
public List<decimal> prices { get; set; }
public long dateInTicks { get; set; }
}
그러나 Data-parameter는 null이 아니지만 그 안에있는 List와 long도 모두 0입니다.
편집 2 :
FireFox의 RESTClient Body 사용 :
"productIds":[20,25],"prices":[0.4,7.4],"dateInTicks":1402444800
JObject 매개 변수가 다음과 같은 이유 :
{
"\"productIds\":": {
"20,25],\"prices\":": {
"0.4,7.4],\"dateInTicks\":1402444800": ""
}
}
}
대신 :
{
\"productIds\":[20,25],\"prices\":[0.4,7.4],\"dateInTicks\":1402444800
}
[
배열이 있는 첫 번째 항목 을 자동으로 제거하고 :" {"
..
수업 추가 :
public class Data
{
public List<int> productIds { get; set; }
public List<decimal> prices { get; set; }
public long dateToTicks { get; set; }
}
그리고 API 메서드의 서명을 변경하여 매개 변수로받습니다.
속성 이름은 파스칼 대소 문자입니다. deserializer의 기본 구성이 낙타 케이스를 허용하지 않기 때문에 의도적으로 수행했습니다. json을 처리하고 'normal'속성 대 / 소문자를 사용하려면 다음을 추가하십시오.
config.Formatters.JsonFormatter.SerializerSettings.ContractResolver
= new CamelCasePropertyNamesContractResolver();
사이트 구성 파일의 줄에 App_Start
새 템플릿의 폴더 또는 Global.asax.cs
. 구성은 유형 HttpConfiguration
입니다.
추가 조사를 통해 귀하가 유효하지 않은 (json 유효성 검사기에 관한 한 유효하지 않지만 당면한 작업에 적절하지 않음) json 콘텐츠가 있다는 결론에 도달했습니다. 다음과 같이 게시하는 경우 :
{
"productIds": [20, 25],
"prices": [0.40, 7.40],
"dateToTicks": "1402444800"
}
추가 따옴표가 없으면 Data 클래스로 역 직렬화됩니다. 그대로 유지해야하는 경우 줄 바꿈 따옴표를 풀면 값 목록이 아닌 3 개의 문자열 속성이있는 json 개체가있는 것처럼 수동으로 deserialize해야합니다.
이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.
침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제
몇 마디 만하겠습니다