首页 > 解决方案 > 无法将类型“字符串”隐式转换为“布尔”JSON

问题描述

嗨,我需要帮助从我从 aJSON 文件创建的对象列表中查找值:

JSON结构:

{
    "mp": "1",
    "mpuus": [
      {
        "id": "100",
        "tpuus": [
          "000000001",
          "000000002"
        ]
      },
      {
        "id": "101",
        "tpuus": [
          "00000003"
        ]
      }
    ]
  },
  {
    "mp": "2",
    "mpuus": [
      {
        "id": "200",
        "tpuus": [
          "0000004"
        ]
      }
    ]
  },

我将 JSON 转换为

 RootMedicationMapping object.
List<rootMedicationMapping> = JsonHandler.DeserializeJasonArrayFromFile<RootMedicationMapping>(@"JSON File PATH");

我想通过 tpuu 值搜索rootMedicationMapping列表并获取 mp 值。

例如,我传递的值是 tpuu = 000000002,我想取回 mp 值(在这种情况下为 1)

这正在尝试以下语法,但它正在抛出我

'不能将类型'string'隐式转换为'bool'

var mpId= rootMedicationMapping.Find(x => x.MPUUs.Find(y=>y.Tpuus.Find(z=>z.Equals("tpuu value"))));

标签: c#jsonlinq

解决方案


List.Find(Predicate)的参数需要是一个Predicate,它是一个委托,它接受您正在搜索的对象的实例,并期望返回一个 bool 来指定对象是否匹配。目前,在您的内部 Find 调用的 Predicate 中,您只是返回另一个 Find 调用的结果,这是一个字符串而不是预期的bool,导致您看到的错误。

要解决此问题,您只需要确保 Predicate 参数返回 bool。有了你所拥有的,你可以添加检查内部 Find 调用是否返回null

var mpId = 
    rootMedicationMapping.Find(x => 
        x.MPUUs.Find(y => 
            y.Tpuus.Find(z => 
                z.Equals("tpuu value")) != null) != null)?.mp;

您还可以使用 LINQ 编写此代码,允许通过以下方式处理空检查Any

var mpId = 
    rootMedicationMapping.FirstOrDefault(x => 
        x.MPUUs.Any(y => 
            y.Tpuus.Any(z => 
                z.Equals("tpuu value"))))?.mp;

推荐阅读