【问题标题】:C# Conditionally looping through JSON valuesC# 有条件地循环遍历 JSON 值
【发布时间】:2019-01-22 06:43:33
【问题描述】:

我是新手,如果是重复的问题,我深表歉意。在这一点上,我已经尝试了很多不同的东西,我不确定这样做的正确方法。

我正在尝试编写一个函数来循环遍历 JSON 并获取模型在某些条件下的值(即:qty != nullsector = 1position = 1

我还需要计算每个独特模型的出现次数。 任何帮助将不胜感激。

这是JSON 的样子。

    [ { "sector": "1", "position": "1", "qty": "1", "model": "SBNHH-1D65C" },
      { "sector": "2", "position": "1", "qty": "1", "model": "" }, 
      { "sector": "3", "position": "1", "qty": "1", "model": "DC6-48-60-18-8F" }, 
      { "sector": "1", "position": "2", "qty": "1", "model": "SBNHH-1D65C" }, 
      { "sector": "2", "position": "2", "qty": "1", "model": "DC6-48-60-18-8F" } ]



public class AntennaItems
{
        public AntennaItems[] root { get; set; }
        public int sector { get; set; }
        public int position { get; set; }
        public string qty { get; set; }
        public string model { get; set; }
}

string requestBodyString = await new StreamReader(req.Body).ReadToEndAsync();

var newJsonString = @"{root:" + requestBodyString + @"}";

List<string> modelList = new List<string>();

var jsonObj = JsonConvert.DeserializeObject<AntennaItems>(newJsonString);

foreach (var elem in jsonObj.root)
{
    modelList.Add(elem.model);
}

return new OkObjectResult($"modelList = {modelList}");

目前我收到了这样的回复:

modelList = System.Collections.Generic.List`1[System.String]

【问题讨论】:

  • 你能用自定义转换器注释你的模型,然后使用JsonConverter.CanConvert 方法吗?
  • 这一行有什么用 var newJsonString = @"{root:" + requestBodyString + @"}";,
  • 谢谢约翰尼。我会研究自定义转换器
  • Kiren - 最初,当 json 是字符串时,我使用 root 作为在 root 级别读取 id/values 的一种方式。它可能不再需要了。

标签: c# json parsing


【解决方案1】:

您将在插值中返回您的 modelList,字符串名称为 modelList,插值返回您的 modelList 类型,在您的情况下为 System.Collections.Generic.List'1[System.String]

所以这一行

return new OkObjectResult($"modelList = {modelList}"); 

给你

modelList = System.Collections.Generic.List`1[System.String]

所以不要像上面那样返回,而是尝试用匿名类型返回你的modelList,这样你就可以得到包含modelList的实际数据,比如

return new OkObjectResult(new { modelList = modelList}); 

或者干脆

return new OkObjectResult(modelList);

【讨论】:

  • 做到了!谢谢大家的帮助!
  • 很高兴听到,请在答案左侧打勾以使其变为绿色:)
【解决方案2】:

我认为您不需要 root 属性。我稍微修改了类并从中删除了 root 属性:

        public class AntennaItems
    {
        public int sector { get; set; }
        public int position { get; set; }
        public string qty { get; set; }
        public string model { get; set; }
    }


    public HttpResponse ParseJson()
    {
        string requestBodyString = await new StreamReader(req.Body).ReadToEndAsync();

        var newJsonString = @"{root:" + requestBodyString + @"}";

        List<string> modelList = new List<string>();

        var jsonObj = JsonConvert.DeserializeObject<List<AntennaItems>>(newJsonString);

        foreach (var elem in jsonObj)
        {
            modelList.Add(elem.model);
        }
        return new OkObjectResult($"modelList = {modelList}");
    }

你需要在 List 中反序列化它。如果有帮助,请告诉我。

【讨论】:

  • 我进行了更改并删除了 root,但仍然得到相同的结果。见下文。
【解决方案3】:
public class AntennaItems
    {
        public int sector { get; set; }
        public int position { get; set; }
        public string qty { get; set; }
        public string model { get; set; }


        [FunctionName("AntennaSort")]
public static async Task<IActionResult> Run(
            [HttpTrigger(AuthorizationLevel.Function, "get", "post", Route = null)] HttpRequest req,
            ILogger log)
        {
            log.LogInformation("C# HTTP trigger function processed a request.");

            string requestBody = await new StreamReader(req.Body).ReadToEndAsync();

            List<string> modelList = new List<string>();

            var jsonObj = JsonConvert.DeserializeObject<List<AntennaItems>>(requestBody);

            foreach (var elem in jsonObj)
            {
                modelList.Add(elem.model);
            }
            return new OkObjectResult($"modelList = {modelList}");
        }

结果是 modelList = System.Collections.Generic.List`1[System.String]

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-12-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多