【问题标题】:Access Cosmos Db JSON data using C# MVC使用 C# MVC 访问 Cosmos Db JSON 数据
【发布时间】:2020-01-09 02:25:21
【问题描述】:

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

无法从 System.DateTime 转换或转换为 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 数据的资源,请提供链接以供参考。 谢谢。

【问题讨论】:

  • 在 JSON 中,LastContact 是单个 Entry 对象。但在您的模型中,LastContact 的类型为 Dictionary&lt;string, Entry&gt;。应该是什么?
  • LastContact 是单条目对象。但不知道怎么称呼它
  • Entry 类中的对象更改为 DateTime 并将 Dictionary&lt;string, Entry&gt; 更改为 Entry
  • 您能否解释更多或提供信息链接@Jawad

标签: c# json nested azure-cosmosdb subitem


【解决方案1】:
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; }
}

如果您选择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
}

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

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

在类中定义类型肯定更好,这样在反序列化时,您不必将其解析为应有的类型。反序列化程序应该为您处理这些问题,并将您的字符串转换为您的类的类型,如果它是可转换的,例如,自动将字符串转换为GuidDateTime

【讨论】:

  • 添加反序列化代码后,我收到错误“CS0103 C# The name 'json' does not exist in the current context” 我还添加了 Newtonsoft.Json 库。 @贾瓦德
  • json 是一个包含 json 数据内容的字符串。那是我的测试变量。
  • @Ana,你能解决这个问题吗?
  • 没有还在苦苦挣扎。 @Jawad 你能解释一下吗
  • @Ana 你更新了这里提到的类吗?你如何反序列化 json
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-10-03
  • 2020-10-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-10-03
相关资源
最近更新 更多