使用 C# MVC 访问 Cosmos Db JSON 数据

Access Cosmos Db JSON data using C# MVC

我正在尝试使用 c# MVC Web 应用程序显示 Cosmos db JSON 子项。 但是我收到一个错误:

Could not cast or convert from System.DateTime to WebApplication1.Models.Entry.

JSON:

 "DataTypeId": 1,
"IPaddress": "192.168.2.177",
"id": "d1b81653-b7a5-4d79-85ea-79c01f43f747",
"PhoneNo": "0417518324",
"LastContact": {
    "EnvLog": "2019-09-07T19:41:08",
    "Ping": "2020-01-09T12:10:09",
    "SpdLog": "2019-09-07T19:41:08"
},
"SpeedLog": true,
"DeviceModelId": 2,
"DisconnectEvents": 9,

型号:

    public class DeviceMap
{

    [JsonProperty(PropertyName = "id")]
    public string Id { get; set; }

    [JsonProperty(PropertyName = "IPaddress")]
    public string IPaddress { get; set; }

    [JsonProperty(PropertyName = "SpeedLog")]
    public bool SpeedLog { get; set; }

    [JsonProperty(PropertyName = "LastContact")]
    public Entry LastContact { get; set; }
}

 public class Entry

{

    [JsonProperty(PropertyName = "EnvLog")]
    public DateTime EnvLogtime { get; set; }

    [JsonProperty(PropertyName = "Ping")]
    public DateTime Ping { get; set; }

    [JsonProperty(PropertyName = "SpdLog")]
    public DateTime SpdLog { get; set; }
}
}

控制器:

public class DeviceMapController : Controller
{
    [ActionName("Index")]
    public async Task<ActionResult> Map1Async()
    {
        string empty = "Unknown";

        var items = await DocumentDBRepository<DeviceMap>.GetMap1Async(d => d.Id != null, d => d.Lat != empty);
        if (Convert.ToInt32(User.GroupId()) != 200) 
            {
                items = items.Where(d => d.GroupId == Convert.ToInt32(User.GroupId()));

        }

        return View(items);

    }
}

查看:

             @foreach (var item in Model)
                    {


                        if ((@item.IPaddress == "192.168.2.14") || (@item.IPaddress == "192.168.2.13") || (@item.IPaddress == "192.168.2.15") || (@item.IPaddress == "192.168.2.16")) { }
                        else
                        {

                            //SideId string
                            string siteId = null;
                            string newsiteId = null;
                            if (item.IPaddress != "0")
                            {

                                int index = item.IPaddress.IndexOf('.') + 1;
                                int space = item.IPaddress.IndexOf('.', index + 1);
                                int space2 = item.IPaddress.IndexOf('.', space + 1);
                                int end = item.IPaddress.Length;
                                if (index > 0) { siteId = item.IPaddress.Substring(space + 1, end - space - 1); newsiteId = siteId.Replace('.', '-'); }
                            }
                           //  string Cutoff =Html.DisplayFor(modelItem => item.LastContact.Ping).ToString();
                         // DateTime day = DateTime.Parse(Cutoff.Value,"dd/MM/yyyy HH:mm:ss", CultureInfo.CurrentCulture);

                          DateTime myday =Html.DisplayFor(modelItem => item.LastContact.Ping);
                            DateTime now = DateTime.Now;
                            DateTime yesterday = now.AddDays(-7);
                            DateTime d;
                       //  DateTime.TryParseExact(myday,@"dd/MM/yyyy HH:mm:ss", CultureInfo.InvariantCulture, DateTimeStyles.AssumeUniversal,out d);


                          // if (Html.DisplayFor(modelItem => item.LastContact.Ping) != null) { d = DateTime.Parse(myday, "dd/MM/yyyy HH:mm:ss", CultureInfo.CurrentCulture); } else { myday = DateTime.ParseExact("08/04/2000 14:00:02", "dd/MM/yyyy HH: mm:ss", CultureInfo.CurrentCulture); }

                            string a = @item.Name;



                            <tr>

                                <td>

                                    @if (a.Length > 50) { a = a.Substring(0, 50); }



                                        @if (item.GroupId != 82)
                                        {

                                            if (myday <= DateTime.Now.AddDays(-7))
                                            {<h4>@myday</h4>
                                                    <img src="/Content/Images/trafficlight-red2.png" width="20" height="20"><a href="@Url.Action("DevicePage", "Device", new { item.DeviceId })"><h6>@a..</h6></a>
                                            }
                                            else
                                            {<img src="/Content/Images/trafficlight-green1.png" width="20" height="20"><a href="@Url.Action("DevicePage", "Device", new { item.DeviceId })"><h6>@a..</h6></a>
                                            }
                                        }


                                        else
                                        {


                                            if (myday <= DateTime.Now.AddDays(-7))
                                            {
                                                <img src="/Content/Images/trafficlight-red2.png" width="20" height="20"><a href="@Url.Action("Form", "TARP", new { item.DeviceId })"><h6>@a..</h6></a>
                                            }
                                            else
                                            {<img src="/Content/Images/trafficlight-green1.png" width="20" height="20"><a href="@Url.Action("Form", "TARP", new { item.DeviceId })"><h6>@a..</h6></a>

                                            }

                                        }

                                        @if (item.IPaddress != "0")
                                        {<p>Site Id: @newsiteId;</p>}
                                    @if (item.LastPing != null)
                                    {
                                        <p>
                                            Last Contact: @Html.DisplayFor(modelItem => item.LastContact.Ping), @Html.DisplayFor(modelItem => item.BatVoltage)V

                                        </p>}


我想显示 Ping 日期和时间。请帮忙。 此外,如果您有关于如何调用不同样式的 JSON 数据的资源,请提供 link 以供参考。 谢谢。

public class DeviceMap
{
    [JsonProperty(PropertyName = "id")]
    public string Id { get; set; } // Suggestion: Change this to 'Guid' instead of string

    [JsonProperty(PropertyName = "IPaddress")]
    public string IPaddress { get; set; }

    [JsonProperty(PropertyName = "SpeedLog")]
    public bool SpeedLog { get; set; }

    [JsonProperty(PropertyName = "LastContact")]
    public Entry LastContact { get; set; }
}

public class Entry

{
    [JsonProperty(PropertyName = "EnvLog")]
    public DateTime EnvLogtime { get; set; }

    [JsonProperty(PropertyName = "Ping")]
    public DateTime Ping { get; set; }

    [JsonProperty(PropertyName = "SpdLog")]
    public DateTime SpdLog { get; set; }
}

如果您将 select DateTime 作为 Entry 中每个变量的类型,您的 LastContact 将正确反序列化。

测试

我使用了您的 json 并将其转换为 DeviceMap 对象以对其进行测试并确保上述工作正常。

{
  "DataTypeId": 1,
  "IPaddress": "192.168.2.177",
  "id": "d1b81653-b7a5-4d79-85ea-79c01f43f747",
  "PhoneNo": "0417518324",
  "LastContact": {
    "EnvLog": "2019-09-07T19:41:08",
    "Ping": "2020-01-09T12:10:09",
    "SpdLog": "2019-09-07T19:41:08"
  },
  "SpeedLog": true,
  "DeviceModelId": 2,
  "DisconnectEvents": 9
}

并在我的主程序中使用以下内容对其进行反序列化以确保其正常工作。

DeviceMap map = JsonConvert.DeserializeObject<DeviceMap>(json);

最好在class中定义类型,这样在反序列化时,您就不必将其解析为应有的类型。反序列化器应该为您处理好并将您的字符串转换为您的 class 类型(如果它是可转换的),例如,自动将字符串转换为 GuidDateTime.