【问题标题】:Problem to display json data after deserialization反序列化后显示json数据的问题
【发布时间】:2020-04-09 07:31:07
【问题描述】:

我试图在 .net core 2.0 应用程序中反序列化后显示 json 数据。 JSON 文件由我的提要提供商每 1-3 秒通过 POST 请求发送到我的服务器(他将数据推送到我的服务器)

这就是我正在做的:

  1. 我处理了一个 POST 请求发送的 gzip 文件,并解压其中的 json 文件并将其下载到我的服务器上(完成)

  2. 现在,我正在尝试读取此 json 文件并将其显示在第一页“index.cshtml”上。我们将为提要提供者发送的每个 POST 请求创建一个新行 --> 行逐行实时显示(尚未完成)

INDEX.XSHTML 视图示例

1- FIRST LINE = "info":{"id":84844481,"name":"五岛 vs Pigotts Bullets FC","sport":"Soccer","league":"Antigua and Barbuda 总理 Division","start_time":"22:11","start_date":"15.12.2019","start_ts":1576444268,"period":"2nd 半场","分钟":"73","秒":"72:54","得分":"0:0","点数":"","pitch":"","ball_pos":" ","add_time":"","player":"","state":"21012"}

2- 第二行 = "info":{"id":84844482,"name":"xxxx vs xxxx FC","sport":"足球","联赛":"SERIE A","start_time":"22:30","start_date":"15.12.2019","start_ts":1576444268,"period":"2nd 半场","分钟":"18","秒":"18:54","得分":"0:0","点数":"","pitch":"","ball_pos":" 0.71, 0.48","add_time":"","player":"hoffman","state":"21000"} 3- ETC. ....

PS:这里我只是按原样复制了信息标签 => 确定我需要格式正确的信息,例如:1- FIRST LINE : id = xxxxx, name="", ....

这是 JSON 提要的示例:https://filebin.net/k5enw2wn4f5bc89m/inplay-soccer.json?t=84y0df94

到目前为止,这是我的代码:

值控制器

using System;
using System.Collections.Generic;
using System.IO;
using System.IO.Compression;
using System.Linq;
using System.Net;
using System.Text;
using System.Threading.Tasks;
using HelloWorld.Models;
using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.Mvc;
using Newtonsoft.Json;

// For more information on enabling Web API for empty projects, visit https://go.microsoft.com/fwlink/?LinkID=397860

namespace HelloWorld.Controllers
{
    [Route("")]
    public class ValuesController : Controller
    {

        // POST api/<controller>

        [HttpPost]
        [Consumes("application/gzip")]
        public async Task<IActionResult> PostAsync(IFormFile file)
        {

                WebClient Client = new WebClient();
                Client.DownloadFile("http://inplay.goalserve.com/inplay-soccer.gz", "C:\\temp\\inplay-soccer.gz");
                using (var inputFileStream = new FileStream("c:\\temp\\inplay-soccer.gz", FileMode.Open))
                using (var gzipStream = new GZipStream(inputFileStream, CompressionMode.Decompress))
                using (var outputFileStream = new FileStream("c:\\temp\\inplay-soccer.json", FileMode.Create))
                {
                    await gzipStream.CopyToAsync(outputFileStream);
                }

                using (StreamReader r = new StreamReader("c:\\temp\\inplay-soccer.json"))
                {
                     string json = r.ReadToEnd();
                     var objects = JsonConvert.DeserializeObject<Goalserve>(json);
                     return View(objects);
                }
                return Ok();
          }
       }
    }

Goalserve 模型(我用https://app.quicktype.io/ 生成它)-->这里可能有些问题!

using Newtonsoft.Json;
using Newtonsoft.Json.Converters;
using System;
using System.Collections.Generic;
using System.Globalization;
using System.Linq;
using System.Threading.Tasks;

namespace HelloWorld.Models
{
    public partial class Goalserve
    {
        [JsonProperty("updated")]
        public string Updated { get; set; }

        [JsonProperty("updated_ts")]
        public long UpdatedTs { get; set; }

        [JsonProperty("events")]
        public Events Events { get; set; }
    }

    public partial class Events
    {
        [JsonProperty("84586848")]
        public The84586848 The84586848 { get; set; }
    }

    public partial class The84586848
    {
        [JsonProperty("core")]
        public Core Core { get; set; }

        [JsonProperty("info")]
        public InfoClass Info { get; set; }

        [JsonProperty("stats")]
        public Dictionary<string, Stat> Stats { get; set; }

        [JsonProperty("odds")]
        public Dictionary<string, Odd> Odds { get; set; }
    }

    public partial class Core
    {
        [JsonProperty("safe")]
        public long Safe { get; set; }

        [JsonProperty("stopped")]
        public long Stopped { get; set; }

        [JsonProperty("blocked")]
        public long Blocked { get; set; }

        [JsonProperty("finished")]
        public long Finished { get; set; }

        [JsonProperty("updated")]
        public DateTimeOffset Updated { get; set; }

        [JsonProperty("updated_ts")]
        public long UpdatedTs { get; set; }
    }

    public partial class InfoClass
    {
        [JsonProperty("id")]
        public long Id { get; set; }

        [JsonProperty("name")]
        public string Name { get; set; }

        [JsonProperty("sport")]
        public string Sport { get; set; }

        [JsonProperty("league")]
        public string League { get; set; }

        [JsonProperty("start_time")]
        public string StartTime { get; set; }

        [JsonProperty("start_date")]
        public string StartDate { get; set; }

        [JsonProperty("start_ts")]
        public long StartTs { get; set; }

        [JsonProperty("period")]
        public string Period { get; set; }

        [JsonProperty("minute")]
        [JsonConverter(typeof(ParseStringConverter))]
        public long Minute { get; set; }

        [JsonProperty("secunds")]
        public string Secunds { get; set; }

        [JsonProperty("score")]
        public string Score { get; set; }

        [JsonProperty("points")]
        public string Points { get; set; }

        [JsonProperty("pitch")]
        public string Pitch { get; set; }

        [JsonProperty("ball_pos")]
        public string BallPos { get; set; }

        [JsonProperty("add_time")]
        public string AddTime { get; set; }

        [JsonProperty("player")]
        public string Player { get; set; }

        [JsonProperty("state")]
        [JsonConverter(typeof(ParseStringConverter))]
        public long State { get; set; }
    }

    public partial class Odd
    {
        [JsonProperty("id")]
        public long Id { get; set; }

        [JsonProperty("name")]
        public string Name { get; set; }

        [JsonProperty("short_name")]
        public string ShortName { get; set; }

        [JsonProperty("suspend")]
        public long Suspend { get; set; }

        [JsonProperty("order")]
        public long Order { get; set; }

        [JsonProperty("info")]
        public InfoEnum Info { get; set; }

        [JsonProperty("participants")]
        public Dictionary<string, Participant> Participants { get; set; }
    }

    public partial class Participant
    {
        [JsonProperty("id")]
        public long Id { get; set; }

        [JsonProperty("order")]
        public long Order { get; set; }

        [JsonProperty("name")]
        public string Name { get; set; }

        [JsonProperty("short_name")]
        public string ShortName { get; set; }

        [JsonProperty("value_eu")]
        public string ValueEu { get; set; }

        [JsonProperty("value_na")]
        public string ValueNa { get; set; }

        [JsonProperty("value_us")]
        public string ValueUs { get; set; }

        [JsonProperty("handicap")]
        public string Handicap { get; set; }

        [JsonProperty("suspend")]
        public long Suspend { get; set; }
    }

    public partial class Stat
    {
        [JsonProperty("name")]
        public string Name { get; set; }

        [JsonProperty("home")]
        public string Home { get; set; }

        [JsonProperty("away")]
        public string Away { get; set; }
    }

    public enum InfoEnum { Count070007959, CurrentCorners11, Empty };

    internal static class Converter
    {
        public static readonly JsonSerializerSettings Settings = new JsonSerializerSettings
        {
            MetadataPropertyHandling = MetadataPropertyHandling.Ignore,
            DateParseHandling = DateParseHandling.None,
            Converters =
            {
                InfoEnumConverter.Singleton,
                new IsoDateTimeConverter { DateTimeStyles = DateTimeStyles.AssumeUniversal }
            },
        };
    }

    internal class ParseStringConverter : JsonConverter
    {
        public override bool CanConvert(Type t) => t == typeof(long) || t == typeof(long?);

        public override object ReadJson(JsonReader reader, Type t, object existingValue, JsonSerializer serializer)
        {
            if (reader.TokenType == JsonToken.Null) return null;
            var value = serializer.Deserialize<string>(reader);
            long l;
            if (Int64.TryParse(value, out l))
            {
                return l;
            }
            throw new Exception("Cannot unmarshal type long");
        }

        public override void WriteJson(JsonWriter writer, object untypedValue, JsonSerializer serializer)
        {
            if (untypedValue == null)
            {
                serializer.Serialize(writer, null);
                return;
            }
            var value = (long)untypedValue;
            serializer.Serialize(writer, value.ToString());
            return;
        }

        public static readonly ParseStringConverter Singleton = new ParseStringConverter();
    }

    internal class InfoEnumConverter : JsonConverter
    {
        public override bool CanConvert(Type t) => t == typeof(InfoEnum) || t == typeof(InfoEnum?);

        public override object ReadJson(JsonReader reader, Type t, object existingValue, JsonSerializer serializer)
        {
            if (reader.TokenType == JsonToken.Null) return null;
            var value = serializer.Deserialize<string>(reader);
            switch (value)
            {
                case "":
                    return InfoEnum.Empty;
                case "Count : 0 (70:00 - 79:59)":
                    return InfoEnum.Count070007959;
                case "Current Corners : 11":
                    return InfoEnum.CurrentCorners11;
            }
            throw new Exception("Cannot unmarshal type InfoEnum");
        }

        public override void WriteJson(JsonWriter writer, object untypedValue, JsonSerializer serializer)
        {
            if (untypedValue == null)
            {
                serializer.Serialize(writer, null);
                return;
            }
            var value = (InfoEnum)untypedValue;
            switch (value)
            {
                case InfoEnum.Empty:
                    serializer.Serialize(writer, "");
                    return;
                case InfoEnum.Count070007959:
                    serializer.Serialize(writer, "Count : 0 (70:00 - 79:59)");
                    return;
                case InfoEnum.CurrentCorners11:
                    serializer.Serialize(writer, "Current Corners : 11");
                    return;
            }
            throw new Exception("Cannot marshal type InfoEnum");
        }

        public static readonly InfoEnumConverter Singleton = new InfoEnumConverter();
    }
}

Index.xshtml

@page
@model HelloWorld.Models.Goalserve
@{
    var objects = Model;
}
<table>
    <tr>
        test
        <td>@objects.ToString()</td>
    </tr>
</table>

有人可以帮我实现这个 .net 应用程序吗?

我确信有一些我不熟悉的概念/模型,如果有人可以帮助我实现此代码,我将不胜感激。

非常感谢您的帮助!

【问题讨论】:

    标签: asp.net .net json asp.net-core .net-core


    【解决方案1】:

    您可以使用 LINQ 查询 JSON 文件。参考:SelectToken

    var jobject = JObject.Parse(json);
    var results = jobject.SelectTokens("$..info");
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-01-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-06-23
      • 2021-05-28
      • 1970-01-01
      相关资源
      最近更新 更多