【问题标题】:RestSharp Serializing Json objects to Post parametersRestSharp 将 Json 对象序列化为 Post 参数
【发布时间】:2014-01-10 02:57:31
【问题描述】:

我正在处理这个需要序列化 ​​JSON 对象以使用 RestSharp 发布参数的项目,下面是我的代码:

        var request = new RestRequest();
        request.Method = Method.POST;
        request.RequestFormat = DataFormat.Json;

        request.AddBody(jsonObject);
        return client.Execute<dynamic>(request);

我意识到,request.AddBody 不是将每个 JSON 名称值对添加为一个 post 参数,而是将整个 JSON 字符串添加为一个大的 post 参数。我的问题是,有没有办法让request.AddBody 方法将每个 JSON 名称-值对添加为单独的帖子参数?我知道request.AddParameter() 可以完成这项工作,但这需要手动添加每个参数。

代替:

     [0]:{
           application/json="
           {
               "name":"john doe",
               "age": "12",
               "gender": "male"}
           }
         }

期望的结果:

     [0]:"name":"john doe"
     [1]:"age":"12"
     [2]:"gender":"male"

【问题讨论】:

  • 你能举一个你想要完成的例子吗?向我们展示您从什么开始以及您希望最终结果是什么。
  • 我不明白您的“期望结果”的格式 - 它似乎不是 POST 请求正文的标准格式。像?name=john doe&amp;age=12&amp;gender=male 这样的东西会更规范。你能确认一下这是否是你的想法吗?
  • @DanielC,是的,这正是我想要的。但不是有一个 foreach 循环来添加单个参数,我只是想知道 JSON.net 中是否有任何解决方案可以将所有 json 转换为类似 ?name=john doe&age=12&gender=male

标签: c# json json.net restsharp http-post


【解决方案1】:
request.AddObject(jsonObject)

应该做你所期望的

引用RestSharp docs:

要将对象的所有属性添加为参数,请使用 AddObject()。

【讨论】:

  • 您应该包括为什么这应该按预期进行。这是一个没有解释的弱答案。
  • 这基本上是上面循环的替代,对jsonObject中的每个字段执行AddParameter()。
【解决方案2】:

有一个类似的问题并找到了这个帖子。想出了一个简单的方法,我想我会分享一下,以防它帮助其他人。

诀窍是与 AddJsonBody() 一起使用匿名对象。

request.AddJsonBody(new { name = "john doe", age = "12", gender = "male" });

RestSharp 会自动将匿名对象序列化为所需的 JSON...

{
    "name":"john doe",
    "age": "12",
    "gender": "male"
}

【讨论】:

    【解决方案3】:

    答案似乎是遍历您的 jsonObject 并将每个所需的 JSON 名称-值对转换为参数。为此,您可以在循环中使用 request.AddParameter 方法,该方法通过以下方式遍历您的 jsonObject 的名称-值对:

    foreach (var pair in jsonObject) 
    { 
        request.AddParameter(pair.Key, pair.Value); 
    }
    

    这可能过于简单,但使用 JSON.NET 之类的库,应该很容易做到。然后你可以将这个功能包装成一个不错的小方法并随意重用。没有体力劳动。

    注意:您可能希望删除现有代码中的 request.RequestFormat = DataFormat.Json 行,因为 JSON 正是您似乎不想发布的内容。

    【讨论】:

    • 感谢丹尼尔,我想这将是目前唯一的解决方案。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-10-14
    • 2014-03-05
    • 2010-10-08
    相关资源
    最近更新 更多