NewtonSoft json解析

时间:2018-04-17 09:41:20

标签: c# json json.net

有人可以帮我解析json并获取详细信息。 假设我有Top3输入参数作为警察,我想知道相应的Test1Child,在那个Top3数组中,我需要检查 var json = File.ReadAllText(jsonFile); // below json is stored in file jsonFile var jObject = JObject.Parse(json); JArray MappingArray =(JArray)jObject["Top1"]; string strTop1 = ObjZone.Top1.ToString(); string strTop2 = ObjZone.Top2.ToString(); var JToken = MappingArray.Where(obj => obj["Top2"].Value<string>() == strTop2).ToList(); 值是否存在。 我正在使用newtonsoft json + c#,到目前为止,我可以使用下面的代码

获取DeviceTypes
{
   "Top1": [
    {
      "Top2": "Test1",
      "Top3": [
        "Test1Child"
      ]
    },
    {
      "Top2": "Test2",
      "Top3": [
        "Test2Child"
      ]
    }
    ]
}

//的Json

maybeRequest

1 个答案:

答案 0 :(得分:2)

我使用http://json2csharp.com/(或任何其他json到c#解析器),然后使用C#对象(对我来说更简单) 对于这种情况,这看起来就像那样:

namespace jsonTests
{
    public class DeviceTypeWithResponseTypeMapper
    {
        public string DeviceType { get; set; }
        public List<string> ResponseTypes { get; set; }
    }

    public class RootObject
    {
        public List<DeviceTypeWithResponseTypeMapper> DeviceTypeWithResponseTypeMapper { get; set; }
    }
}

并在代码中使用它:

    var rootob = Newtonsoft.Json.JsonConvert.DeserializeObject<RootObject>(str);

    var thoseThatHaveNotUsed = rootob.DeviceTypeWithResponseTypeMapper.Where(dtwrtm =>
              dtwrtm.ResponseTypes.Any(rt => rt == "NotUsed"));

    foreach (var one in thoseThatHaveNotUsed)
    {
        Console.WriteLine(one.DeviceType);
    }

此代码列出了响应中包含“NotUsed”的所有设备类型。

版本2(扩展你的代码)看起来像那样,我相信:

static void Main(string[] args)
{
       var json = str; // below json is stored in file jsonFile
    var jObject = JObject.Parse(json);
    JArray ZoneMappingArray = (JArray)jObject["DeviceTypeWithResponseTypeMapper"];
    string strDeviceType = "Police";
    string strResponseType = "NotUsed";
    var JToken = ZoneMappingArray.Where(obj => obj["DeviceType"].Value<string>() == strDeviceType).ToList();
    var isrespTypeThere = JToken[0].Last().Values().Any(x => x.Value<string>() == strResponseType);

    Console.WriteLine($"Does {strDeviceType} have response type with value {strResponseType}? {yesorno(isrespTypeThere)}");
}

private static object yesorno(bool isrespTypeThere)
{
    if (isrespTypeThere)
    {
        return "yes!";
    }
    else
    {
        return "no :(";
    }
}

结果:

enter image description here

如果您想列出响应类型等于所需的所有设备,您可以使用此代码:

  var allWithResponseType = ZoneMappingArray.Where(jt => jt.Last().Values().Any(x => x.Value<string>() == strResponseType));

    foreach (var item in allWithResponseType)
    {
        Console.WriteLine(item["DeviceType"].Value<string>());
    }