【问题标题】:how to add Array of json object in .NET?如何在 .NET 中添加 json 对象数组?
【发布时间】:2021-12-28 12:42:11
【问题描述】:

我有两个 web API,我想从另一个 api 使用一个 api 的端点,但是这个端点的主体包含这样的 json 对象数组:

{
  "urlOrigin": "string",
  "urlCascade": [
    {
      "customerId": 0,
      "evenement": "string",
      "userId": 0,
      "targetItemId": 0,
      "expireAt": "2021-12-28T12:25:20.606Z"
    }
  ]
}

我所做的是:

        public async Task<HttpResponseMessage> saveShortCodes([FromBody] ShortCode sh)
    {
 Dictionary<String, dynamic> header = new Dictionary<String, dynamic>();
        Dictionary<String, dynamic> request2 = new Dictionary<String, dynamic>();
        List<Dictionary<String, dynamic>> body = new List<Dictionary<String, dynamic>>();
        header.Add("urlOrigin", sh.urlOrigin);
        for(var i=0; i < sh.urls.Count; i++)
        {
            request2.Add("customerId", sh.urls[i].CustomerId);
            request2.Add("evenement", sh.urls[i].Evenement);
            request2.Add("userId", sh.urls[i].UserId);
            request2.Add("expireAt", sh.urls[i].ExpireAt);
            if(sh.urls[i].TargetItemId!=null)
                request2.Add("targetItemId", sh.urls[i].TargetItemId);
            body.Add(request2);
        }
        header.Add("urlCascade", body);
        var httpContent = new StringContent(header.ToString(), System.Text.Encoding.UTF8, "application/json");
        String uri = "http://myUrl/url/generateShortcodes";
        var response = client.PostAsync(uri, httpContent).GetAwaiter().GetResult();
        Console.Write("response " + response);
        return response;
        }

这是我身体的结构:

public class ShortCode
{
    public string urlOrigin { get; set; }
    public List<urlCascade> urls { get; set; }
    public ShortCode()
    {
    }
}


  public class urlCascade
    {
        public int CustomerId { get; set; }
        public String Evenement { get; set; }
        public int UserId { get; set; }
        public int? TargetItemId { get; set; }
        public DateTime ExpireAt { get; set; }
        public urlCascade()
        {
        }
    }

当我尝试使用如图所示的端点时,我得到:

dbug: Microsoft.AspNetCore.Mvc.Formatters.NewtonsoftJsonInputFormatter[1]
  JSON input formatter threw an exception.
  Newtonsoft.Json.JsonReaderException: Unexpected character encountered while parsing value: S. Path '', line 0, position 0.
     at Newtonsoft.Json.JsonTextReader.ParseValue()
     at Newtonsoft.Json.JsonReader.ReadAndMoveToContent()
     at Newtonsoft.Json.JsonReader.ReadForType(JsonContract contract, Boolean hasConverter)
     at Newtonsoft.Json.Serialization.JsonSerializerInternalReader.Deserialize(JsonReader reader, Type objectType, Boolean checkAdditionalContent)
Microsoft.AspNetCore.Mvc.Formatters.NewtonsoftJsonInputFormatter: Debug: JSON input formatter threw an exception.

这似乎是一个 json 格式问题或数据格式,这就是为什么我要求在我的控制器中以正确的方式表示请求的主体。

【问题讨论】:

  • 重命名公共列表 urls { get;放; } 进入公共列表 urlCascade { 获取;放; }
  • 另外,我可以推荐您使用app.quicktype.io 从您提供的 json 示例中检索 C# 类。这对于那些不想为其 JSON 字符串手动生成模型的人非常有帮助。
  • 我真的建议你尽快学习基本的 OOP 和 JSON/JSON 序列化

标签: c# json .net


【解决方案1】:

就像我在 cmets 中所说的那样,您应该真正学习 JSON、OOP 和序列化/反序列化的基础知识,您的代码与 .Net 的良好实践准则相去甚远。您只需要:

public async Task<HttpResponseMessage> SaveShortCodes([FromBody] ShortCode sh)
{
    return await client.PostAsync("http://myUrl/url/generateShortcodes", JsonConvert.SerializeObject(sh));
}

public class UrlCascade
{
    [JsonPropertyName("customerId")]
    public int CustomerId { get; set; }

    [JsonPropertyName("evenement")]
    public string Evenement { get; set; }

    [JsonPropertyName("userId")]
    public int UserId { get; set; }

    [JsonPropertyName("targetItemId")]
    public int TargetItemId { get; set; }

    [JsonPropertyName("expireAt")]
    public DateTime ExpireAt { get; set; }
}

public class ShortCode
{
    [JsonPropertyName("urlOrigin")]
    public string UrlOrigin { get; set; }

    [JsonPropertyName("urlCascade")]
    public List<UrlCascade> UrlCascade { get; set; }
}

【讨论】:

    【解决方案2】:

    使用Newtonsoft.Json 库并将saveShortCodes 方法更改为:

    public async Task<HttpResponseMessage> saveShortCodes([FromBody] ShortCode sh)
    {
       var json = JsonConvert.SerializeObject(sh);
       var httpContent = new StringContent(json, System.Text.Encoding.UTF8, "application/json");
       String uri = "http://myUrl/url/generateShortcodes";
       var response = client.PostAsync(uri, httpContent).GetAwaiter().GetResult();
       Console.Write("response " + response);
       return response;
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-02-22
      • 1970-01-01
      • 2013-03-21
      • 2019-07-16
      • 2011-11-21
      • 2017-08-04
      • 2021-06-13
      相关资源
      最近更新 更多