【问题标题】:API returns JSON returns me in halfAPI 返回 JSON 返回一半
【发布时间】:2018-10-16 11:43:43
【问题描述】:

当我在 API 中发出请求时,它会返回一半的 JSON。可能是因为某些传输数据限制。

对于许多数据的预期响应:

{
    "glossary": {
        "title": "example glossary",
        "GlossDiv": {
            "title": "S",
            "GlossList": {
                "GlossEntry": {
                    "ID": "SGML",
                    "SortAs": "SGML",
                    "GlossTerm": "Standard Generalized Markup Language",
                    "Acronym": "SGML",
                    "Abbrev": "ISO 8879:1986",
                    "GlossDef": {
                        "para": "A meta-markup language, used to create markup languages such as DocBook.",
                        "GlossSeeAlso": ["GML", "XML"]
                    },
                    "GlossSee": "markup"
                }
            }
        }
    }
}

对于申请的多条数据返回:

{
    "glossary": {
        "title": "example glossary",
        "GlossDiv": {
            "title": "S",
            "GlossList": {
                "GlossEntry": {
                    "ID": "SGML",
                    "SortAs": "SGML",
                    "GlossTerm": "Standard Generalized Markup Language",

已经试过了

jsonSerialization maxJsonLength="50000000"

但没有成功

请求 API:

[HttpGet("Sincronizar/{algodoeiraId}")]
public JsonResult GetFardosAlgodoeira(int algodoeiraId, [FromHeader] string DUMANUT)
{
    try
    {
        DateTime? data = null;
        if (!String.IsNullOrEmpty(DUMANUT))
        {
            data = DateTime.ParseExact(DUMANUT, "yyyy-MM-dd HH:mm:ss", System.Globalization.CultureInfo.InvariantCulture).AddMinutes(-20);
        }

        _service = new FardoService(GetClientConnectionString());
        var result = _service.GetFardosAlgodoeira(algodoeiraId, data?.ToString("yyyy-MM-dd HH:mm:ss"));
        return Json(result); // result returns me the desired objects, but where I get the data comes in half
    }
    catch (Exception e)
    {
        Console.WriteLine(e.Message);
        return Json(e);
    }
}

客户:

public async Task<RequestResult<T>> Get<T>(string endPoint, DateTimeOffset? dumanut = null, bool mostrarAlertaSemInternet = true)
{
try
{
client.Timeout = TimeSpan.FromMinutes(20);

var request = new HttpRequestMessage(HttpMethod.Get, new Uri(endPoint));
request.Headers.Add("DUMANUT", dumanut?.ToUniversalTime().ToString("yyyy-MM-dd HH:mm:ss"));

var response = await client.SendAsync(request);

if (response != null && response.IsSuccessStatusCode)
{
var resultString = await response.Content.ReadAsStringAsync();
var result = JsonConvert.DeserializeObject<T>(resultString); // ERROR HERE %%%%%%%%
return new RequestResult<T> { Succeeded = true, ObjetoRetorno = result };
}

return null;
}
catch (Exception ex)
{
//Exception .....
}
}

如何确定是否发生此错误?错误:“未终止的字符串。预期的分隔符:”。路径 '[5066].Peso',第 1 行,位置 1191900。”在 DeserializeObject 中

【问题讨论】:

  • 请详细解释系统。它是如何建造的?如何请求数据?与问题相关的所有可能信息,因为目前它可能是一百万件事情中的任何一件。
  • 哪个 API?您使用什么来通过网络发送/接收实际消息?
  • 对不起,我对 Stack 没有太多经验。我做了一些改变
  • 我把客户端代码
  • 我更新了问题,谁能帮帮我?

标签: c# json api


【解决方案1】:

如果您的 json 或 C# 对象具有自引用循环,通常会发生这种情况。忽略,见this

【讨论】:

  • 如何确定是否发生此错误? (ReferenceLoopHandling) 我没有收到任何类型错误。错误:“未终止的字符串。预期的分隔符:”。路径 '[5066].Peso',第 1 行,位置 1191900。”在 DeserializeObject
【解决方案2】:

我在您的代码中看到了很多问题并且无法理解一半,因为它是西班牙语(我相信),但这里有一个代码示例,它应该采用 iddateTime 并返回一个序列化的 Json 对象
注意:这需要 Newtonsoft.Json Nuget

    [HttpGet]
    public HttpResponseMessage GetFardosAlgodoeira(int id, string dateTime)
    {
        try
        {
            DateTime? data = null;
            if (dateTime is DateTime date)
                data = date;

            var result = _service.GetFardosAlgodoeira(id, dateTime.ToString(new CultureInfo("yyyy-MM-dd HH:mm:ss")));
            return Request.CreateResponse(HttpStatusCode.OK, JsonConvert.SerializeObject(result));
        }
        catch (Exception e)
        {
            return Request.CreateErrorResponse(HttpStatusCode.BadRequest, e);
        }

    }

您很可能无法将其复制/粘贴到您的代码中以使其正常工作,您可能需要进行一些调整,我希望这会有所帮助

【讨论】:

    【解决方案3】:

    我认为问题是由于循环引用对象,所以你需要设置 如果您使用 newtonsoft 包,请忽略 ReferenceLoopHandling

    JsonConvert.SerializeObject(data, 
         Formatting.Indented, 
         new JsonSerializerSetting()
             {
                 ReferenceLoopHandling = ReferenceLoopHandling.Ignore 
             } 
     ));
    

    【讨论】:

    • 如何确定是否发生此错误? (ReferenceLoopHandling) 我没有收到任何类型错误。错误:“未终止的字符串。预期的分隔符:”。路径 '[5066].Peso',第 1 行,位置 1191900。”在 DeserializeObject
    猜你喜欢
    • 1970-01-01
    • 2015-11-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-01-03
    • 1970-01-01
    • 1970-01-01
    • 2019-12-12
    相关资源
    最近更新 更多