【问题标题】:How to parse dynamic array?如何解析动态数组?
【发布时间】:2018-09-27 12:18:52
【问题描述】:

我的数据如下:

[
  {
    "cifId": 735960120
  }, 
  {
    "cifId": 735960121
  }
]

这已作为路由中的动态参数接收。 我想把它转换成List<string>cifId

我尝试使用 JObjectnewton 以及其他各种选项。

以下是代码,但有以下例外:

 private static List<string> GetCifIds(dynamic themeParameters)
        {



            var items = JArray.Parse(themeParameters);
            var cifIds = new List<string>();
            foreach (var dynamicCif in items)
            {
                cifIds.Add(dynamicCif.cifId.ToString());
            }

            return cifIds;


        }

【问题讨论】:

  • "我用牛顿的 JObject 等方法试过了。"请显示您尝试过的内容。不要让我们猜测您的问题可能在哪里。
  • 如果 themeParameters 真的是一个数组 - themeParameters.ToString() 不会给你想要的结果。
  • 首先将数据从字符串(或字节数组,或其他)转换到dynamic 时经历了哪些代码/转换?
  • @JamesThorpe 请看屏幕截图。
  • 请在帖子中包含您的评论,而不是显示为图片。

标签: c# arrays json.net


【解决方案1】:

你可以解析成 JArray 然后遍历数组:

Try it online!

private static List<string> GetCifIds(dynamic themeParameters)
{
    var items = JArray.Parse(themeParameters);
    var cifIds = new List<string>();
    foreach (var dynamicCif in items)
    {
        cifIds.Add(dynamicCif.cifId.ToString());
    }

    return cifIds;
}

如果您的 json 错误地包含在 {} 中,您可以通过删除它使其有效。请记住在解析之前检查 json 是否有效。要检查 json 的有效性,请使用 json validator

Try it online!

private static List<string> GetCifIds(dynamic themeParameters)
{
    var json = themeParameters.ToString();
    var items = JArray.Parse(json.Substring(1, json.Length - 2));
    var cifIds = new List<string>();
    foreach (var dynamicCif in items)
    {
        cifIds.Add(dynamicCif.cifId.ToString());
    }

    return cifIds;
}

【讨论】:

  • 不工作 - 附加信息:'Newtonsoft.Json.Linq.JArray.Parse(string)' 的最佳重载方法匹配有一些无效参数
  • 你能分享一个minimal reproducible example 在.netfiddle 上显示你的错误吗? (随意分叉mine
  • @codebased 我认为themeParameters 不是字符串。使用带有正确输入的minimal reproducible example
  • 啊我可以看到有一个额外的{}。为什么 webapi 路由中的行为是这样的? public IHttpActionResult InvalidateAccountsAndCardsCache([FromBody] 动态主题参数,boolpropagateInvalidation = false)
  • @codebased 此 json ({[ { ""cifId"": 735960120 }]}) 无效
【解决方案2】:

创建一个这样的类

public class JsonModel
{
    public int cifId { get; set; }
}

并将您的 json 解析为

List<int> cifIdList = new List<int>();
var jsonObj = NewtonSoft.JsonConvert.DeserializeObject<List<JsonModel>>(jsonString);
foreach(var elem in jsonObj){
    cifIdList.Add(elem.cifId);
}

您的所有 ID 现在都在列表 cifIdList 中可用

【讨论】:

    猜你喜欢
    • 2020-03-23
    • 1970-01-01
    • 2019-06-10
    • 1970-01-01
    • 2014-05-23
    • 1970-01-01
    • 2018-12-28
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多