C#에서 복잡한 JSON 문자열을 1 파라미터 웹 메드로 전달합니다.
-
23-08-2019 - |
문제
나는 JSON에 JavaScript 객체를 사용하여 JSON을 사용하여 행복한 일련의 일련을 사용했습니다.
JSON.stringify
C#/asp.net의 "정적"webmethod로 전송하고 충분히 충분히 도착합니다. 올바른 매개 변수가 필요하므로 JSON 객체가 "startDate", "endDate", "Reserve"가 있으면 웹 메드가 필요합니다. 이것들은 매개 변수로서.
"기본적으로 내가 가지고있는 주문 객체와 함께이 객체에 여러 매개 변수가 있으므로 웹 메드에서 같은 숫자를 사용해야합니다. 이것은 약간 지저분합니까?" - 설명을하겠습니다
JavaScript의 다소 복잡한 "주문"객체를 가지고 있으며 Stringify를 사용하여 직렬화하고 웹 메드로 보내고 싶지만 모든 매개 변수를 지정하고 싶지는 않습니다.
내 웹 메드에서 이와 같은 것을 기대하고 있었어
public static bool MakeReservation(object order)
그런 다음 내 웹 메드에는 1 개의 매개 변수 만 있지만 json.net을 사용하여 이것을 true c# 객체로 데려 갈 수 있습니다. 나는 이것을 JSON을 전송하는 것처럼 그것을 시도했지만 내 WebMethod에는 실패한 매개 변수가 1 개만 있기 때문입니다.
기본적으로 내가 웹 메드를 계속 사용하고 싶지만 웹 메드에 15 개의 매개 변수를 지정하고 싶지 않다는 것을 기본적으로 말하려고합니다.
JSON -String이 내 웹 메드에 도착하기를 원한 다음 서버에서 분해 할 수 있습니다.
이게 가능해?
jQuery를 사용하여 현재 JSON을 서버 (WebMethod)로 보내는 방법은 다음과 같습니다.
var jsonData = JSONNew.stringify(orderObject);
$.ajax({
type: "POST",
url: "MyService.aspx/DoReservation",
data: jsonData,
contentType: "application/json; charset=utf-8",
dataType: "json",
success: function(msg) {
success = true;
},
error: function(msg) {
success = false;
},
async: false
});
해결책
다음과 같은 것처럼 보이는 객체를 제출하려고하면 다음과 같습니다.
JSON.stringify({ endDate: new Date(2009, 10, 10), startDate: new Date() });
WebMethod의 해당 매개 변수로 EndDate 및 StartDate를 맵핑하려고합니다. 하나의 단일 방법 만 받아들이려면 다음을 제출하여 도망 갈 수 있다고 생각합니다.
JSON.stringify({ order: orderObject });
WebMethod의 'Order'매개 변수에 값으로 할당하려고 할 수 있습니다. 실패, 제출
JSON.stringify({ order: JSON.stringify(orderObject) });
그런 다음 JSON.NET을 사용하여 필사적으로 사용하는 것은 확실히 작동해야하지만 추악하므로 첫 번째 예제를 먼저 사용해보십시오. 그게 내 최고의 샷입니다.
다른 팁
있을 수있다. 나는 내용을 설명하는 데별로 잘하지 못하고 내 예제 코드를 보여줄 것입니다.
자바 스크립트 :
var Order = function(name, orderid, price) {
this.name = name;
this.orderid = orderid;
this.price = price;}
var pagePath = window.location.pathname;
function setOrder() {
var jsOrder = new Order("Smith", 32, 150);
var jsonText = JSON.stringify({ order: jsOrder });
$.ajax({
type: "POST",
url: pagePath + "/SetOrder",
contentType: "application/json; charset=utf-8",
data: jsonText,
dataType: "json",
success: function(response) {
alert("wohoo");
},
error: function(msg) { alert(msg); }
});
}
C# 코드 뒤
public class Order
{
public string name { get; set; }
public int orderid { get; set; }
public int price { get; set; }
}
[WebMethod]
public static void SetOrder(object order)
{
Order ord = GetOrder(order);
Console.WriteLine(ord.name +","+ord.price+","+ord.orderid);
}
public static Order GetOrder(object order)
{
Order ord = new Order();
Dictionary<string,object> tmp = (Dictionary<string,object>) order;
object name = null;
object price = null;
object orderid = null;
tmp.TryGetValue("name", out name);
tmp.TryGetValue("price", out price);
tmp.TryGetValue("orderid", out orderid);
ord.name = name.ToString();
ord.price = (int)price;
ord.orderid = (int) orderid;
return ord;
}
내 코드는 그렇게 아름답 지 않지만 당신이 그것의 의미를 얻기를 바랍니다.
나는 최근에 컨트롤러에서 버려지고 싶었던 복잡한 JSON 객체와 함께이 문제를 겪었습니다. 유일한 차이점은 .Stringify 대신 클라이언트에서 .tojson 플러그인을 사용하는 것입니다.
쉬운 답변 :
public static bool MakeReservation(string orderJSON)
{
var serializer = new JavaScriptSerializer();
var order = serializer.Deserialize<Order>(orderJSON);
}
이제 장기 솔루션으로 이러한 사례를 처리하기 위해 사용자 정의 ActionFilterattribute를 만들었습니다. JSON 매개 변수를 감지하고 객체를 버려지고 동작에 매핑을 처리합니다. 당신은 똑같이하는 것을보고 싶을 수도 있습니다.