操作Json 和 SelectTokens with JsonPath

家住魔仙堡 提交于 2020-08-13 18:22:12
原文: 操作Json 和 SelectTokens with JsonPath

JsonPath expression:

$  the root object
@  the current object
..  recursive descent
[] 下标操作符
* 通配符
?() filter 条件

JToken. SelectToken

 

SelectToken是JToken上的一个方法,它采用字符串路径到child token。如果在路径的位置找不到child token.,则SelectToken将返回子child token或空引用。 该路径由以句点分隔的属性名称和数组索引组成,e.g. Manufacturers[0].Name.

 


  
  
  
  
  1. JObject o = JObject.Parse(@"{
  2. 'Stores': [
  3. 'Lambton Quay',
  4. 'Willis Street'
  5. ],
  6. 'Manufacturers': [
  7. {
  8. 'Name': 'Acme Co',
  9. 'Products': [
  10. {
  11. 'Name': 'Anvil',
  12. 'Price': 50
  13. }
  14. ]
  15. },
  16. {
  17. 'Name': 'Contoso',
  18. 'Products': [
  19. {
  20. 'Name': 'Elbow Grease',
  21. 'Price': 99.95
  22. },
  23. {
  24. 'Name': 'Headlight Fluid',
  25. 'Price': 4
  26. }
  27. ]
  28. }
  29. ]
  30. } ");
  31. string name = (string)o.SelectToken("Manufacturers[ 0].Name ");
  32. // Acme Co
  33. decimal productPrice = (decimal)o.SelectToken("Manufacturers[ 0].Products[ 0].Price ");
  34. // 50
  35. string productName = (string)o.SelectToken("Manufacturers[ 1].Products[ 0].Name ");
  36. // Elbow Grease

JToken. SelectTokens with jsonPath


  
  
  
  
  1. JObject o = JObject.Parse(@"{
  2. 'Stores': [
  3. 'Lambton Quay',
  4. 'Willis Street'
  5. ],
  6. 'Manufacturers': [
  7. {
  8. 'Name': 'Acme Co',
  9. 'Products': [
  10. {
  11. 'Name': 'Anvil',
  12. 'Price': 50
  13. }
  14. ]
  15. },
  16. {
  17. 'Name': 'Contoso',
  18. 'Products': [
  19. {
  20. 'Name': 'Elbow Grease',
  21. 'Price': 99.95
  22. },
  23. {
  24. 'Name': 'Headlight Fluid',
  25. 'Price': 4
  26. }
  27. ]
  28. }
  29. ]
  30. } ");
  31. // manufacturer with the name 'Acme Co'
  32. JToken acme = o.SelectToken("$.Manufacturers[?(@.Name == 'Acme Co')] ");
  33. Console.WriteLine(acme);
  34. // { "Name ": "Acme Co ", Products: [{ "Name ": "Anvil ", "Price ": 50 }] }
  35. // name of all products priced 50 and above
  36. IEnumerable<JToken> pricyProducts = o.SelectTokens("$..Products[?(@.Price >= 50)].Name ");
  37. foreach (JToken item in pricyProducts)
  38. {
  39. Console.WriteLine(item);
  40. }
  41. // Anvil
  42. // Elbow Grease

select Token with Linq


  
  
  
  
  1. IList<string> storeNames = o.SelectToken( "Stores").Select( s => (string)s).ToList();
  2. // Lambton Quay
  3. // Willis Street
  4. IList<string> firstProductNames = o[ "Manufacturers"].Select( m => (string)m.SelectToken( "Products[1].Name")).ToList();
  5. // null
  6. // Headlight Fluid
  7. decimal totalPrice = o[ "Manufacturers"].Sum( m => (decimal)m.SelectToken( "Products[0].Price"));
  8. // 149.95

我在项目中遇到的问题是:model下面有很多id,我需要根据传入的多个id去找:

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!