【问题标题】:Format value from Request.InputStream as valid JSON in Asp.net MVC将 Request.InputStream 中的值格式化为 Asp.net MVC 中的有效 JSON
【发布时间】:2017-05-10 12:26:55
【问题描述】:

您好,我从Request.InputStream 收到以下字符串

searchbtn=&__RequestVerificationToken=Cj00sURmj5hhazrlcx72-ahnRwOFhZzMOO5hdMH8epMUFTkicNYlKy9Fs3nZdq_Whzr3I57zZqsncWybsNrQ47Sg4vGQB6GbqRPrL3D0o3Q1
&ClientID=274&CompanyName=&PerformedDate=&X-Requested-With=XMLHt
tpRequest

有没有什么技巧可以将此字符串格式化为有效的 JSON 字符串?

【问题讨论】:

  • 你如何将它传回控制器?是通过 AJAX 吗?

标签: c# asp.net json asp.net-mvc


【解决方案1】:

您能做的最好的事情就是让模型绑定器通过让您的操作接受数据作为类实例来处理它。例如:

public class MyViewModel
{
    public int ClientID { get; set; }
    public string CompanyName { get; set; }
    public DateTime? PerformedDate { get; set; }
}

然后:

public ActionResult Foo(MyViewModel model)

您没有任何理由必须直接访问请求InputStream。如果您出于某种原因需要将其作为 JSON,您可以简单地执行以下操作:

var json = Json.Encode(model);

除此之外,您只需手动解析它并从中创建一个对象。例如:

var data = inputString
    .Split(new[] { '&' }, StringSplitOptions.RemoveEmptyEntries)
    .Select(s => s.Split(new[] { '=' }))
    .ToDictionary(d => d[0], d => d[1]);

然后您可以通过:Json.Encode(data) 将其转换为 JSON。

【讨论】:

  • 我试图第二选择,但得到一个错误的本地或参数命名为 'd' 不能声明的字符串QS = “searchbtn =&__ RequestVerificationToken = Cj00sURmj5hhazrlcx72-ahnRwOFhZzMOO5hdMH8epMUFTkicNYlKy9Fs3nZdq_Whzr3I57zZqsncWybsNrQ47Sg4vGQB6GbqRPrL3D0o3Q1”; qs += "&ClientID=274&CompanyName=&PerformedDate=&X - 已请求 - With = XMLHttpRequest"; var data = qs.Split(new[] { '&' }, StringSplitOptions.None).Select(s => qs.Split(new[] { '=' })).ToDictionary(d => d[0] , d => d[1]);
  • 问题是Select(s => qs。这应该是Select(s => s
  • 使用同样的问题 var data = qs .Split(new[] { '&' }, StringSplitOptions.RemoveEmptyEntries) .Select(s => s.Split(new[] { '=' } )) .ToDictionary(d => d[0], d => d[1]);
  • 我把 d 改成 o (o => o[0], o => o[1]);及其工作。不知道为什么?并添加以下代码以获取 JSON 字符串。字符串 j = JsonConvert.SerializeObject(data,Formatting.Indented);感谢您的帮助。
【解决方案2】:

Chris Pratt 给出了最好的答案,但如果你坚持按照你的要求去做,你可以这样做:

var nameValueCollection = 
System.Web.HttpUtility.ParseQueryString(Request.InputStream);
var dictionary = nameValueCollection.AllKeys.ToDictionary(k => k, k => 
nameValueCollection[k]);
string json = Newtonsoft.Json.JsonConvert.SerializeObject(dictionary);

它确实要求您在请求字符串中没有重复的键。

【讨论】:

    猜你喜欢
    • 2018-04-26
    • 2015-06-16
    • 1970-01-01
    • 2012-09-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-01-30
    • 1970-01-01
    相关资源
    最近更新 更多