【问题标题】:c# mvc 5 call json web service and save on databasec# mvc 5调用json web服务并保存在数据库中
【发布时间】:2018-01-09 16:07:34
【问题描述】:

问候,我想调用一个从控制器返回 json 字符串的 web api,我想将它映射到一个类上,以便我可以将数据保存在数据库中。但我不明白如何将每个数据映射到 json与班级。 我只收到成功的消息。 我的代码是:

public ActionResult API()
{
    var client = new WebClient();
    var text = client.DownloadString("https://www.example.com/api/all-users?name=user%20&pass=password");
    wclients wclients = JsonConvert.DeserializeObject<wclients>(text);

    if (wclients.message == "success")
    {
        ViewBag.name = ("name = " + wclients.name);
    }

    return View();
}

我的看法是这样的:

@foreach (var item in ViewBag.name) {
<tr>
    <td>
       @item
    </td>


</tr>

}

来自 web api 的响应是:

{"status":true,"message":"success","data":[{"name":"test test","email":"senthil@nscript.in","phone":"1234567890","affiliated_id":null,"account":{"real":[{"login":"1001175","pass":"4pJccK8AUWw8"},{"login":"3001180","pass":"4AeCqasw7jX2"},{"login":"3001182","pass":"fS2tf6Gsej7C"}]

【问题讨论】:

  • 你试过了吗?
  • 我正在尝试获取值名称,因此我在视图上有一个名称列表,但我在 wclients.name 上得到的内容为 null
  • 分享您的js 代码。
  • 我没有使用任何 js,我正在尝试通过 ViewBag 传递数据。
  • 然后分享您的查看代码

标签: c# json asp.net-mvc asp.net-web-api model-view-controller


【解决方案1】:

试试下面的代码:

public ActionResult API()
{
    var client = new WebClient();
    var text = client.DownloadString("https://www.example.com/api/all-users?
    name=user%20&pass=password");
    var wclients = JsonConvert.DeserializeObject<dynamic>(text);

        if (wclients.message == "success")
        {
            var data = wclients.data;
        }
      return View();
}

【讨论】:

  • wclients.data 它不在我的类属性中,我看不到如何使用属性数据获取用户列表。
  • wclients 包含您从 api 获得的响应,对吧?
  • wclients 它是我用来将属性映射在一起的类。
  • 您从 api 获得的响应包含 data 属性,如果不使用数据,您将无法获取名称。您可以使用var wclients = JsonConvert.DeserializeObject&lt;wclients&gt;(text); 访问数据。
  • @EniSpetsi,我编辑了我的代码,将text 更改为text.data
【解决方案2】:

JSON 必须直接映射到您的 C# 类。

例如,如果 JSON 具有以下内容:

"name":"test test",
"email":"senthil@nscript.in"

那么你的类(例如 Person.cs)必须具有相同的属性:

public class Person{
    public string name {get;set}
    public string email {get;set}
}

那么你会这样做:

Person person = JsonConvert.DeserializeObject<Person>(json);

在您的示例中,您可能需要wclients.data

if (wclients.message == "success")
{
    ViewBag.name = ("name = " + wclients.data.name);
}

最后,wclients 这个名字表明有多个……在这种情况下:

var names = new List<string>();
foreach(var client in wclients){
    if (client.message == "success")
    {
        names.Add("name = " + client.data.name);
    }
}

【讨论】:

    【解决方案3】:

    wclients.name 永远不会包含任何内容,因为在 JSON 对象结构的顶层没有名为“name”的属性。

    要访问name 属性,您需要枚举data 数组(它应该作为wclients 类的属性存在)并从那里获取名称。

    更新

    如下例所示:

    public class wclients
    {
        public bool status { get; set; }
    
        public string message { get; set; }
    
        public IEnumerable<Account> data { get; set; }
    }
    
    public class Account
    {
        public string name { get; set; }
        public string email { get; set; }
        public string phone { get; set; }
    }
    
    public ActionResult API()
    {
        var client = new WebClient();
        var text = client.DownloadString("https://www.example.com/api/all-users?name=user%20&pass=password");
        wclients clients = JsonConvert.DeserializeObject<wclients>(text);
    
        if (wclients.message == "success")
        {
            ViewBag.name = clients.data;
        }
    
        return View();
    }
    

    在视图中

    @foreach (var item in ViewBag.name)
    {
        <tr>
            <td>
               @item.name
            </td>
        </tr>
    }
    

    【讨论】:

    • 对不起,我没看懂,请你分享一个例子吗?
    猜你喜欢
    • 2016-12-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-10-03
    • 2016-03-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多