如何使用 JSON 路径获取 JSON 字符串的一部分而不是 JToken?

Posted

技术标签:

【中文标题】如何使用 JSON 路径获取 JSON 字符串的一部分而不是 JToken?【英文标题】:How to get section of JSON string instead of JToken using JSON path? 【发布时间】:2019-01-20 10:54:34 【问题描述】:

我正在寻找使用 SelectTokens(JPath) 获取部分 JSON 字符串而不是 JTOken 集合的最佳方法。

例如:

JObject o = JObject.Parse(@"
      'Stores': [
        'Lambton Quay',
        'Willis Street'
      ],
      'Manufacturers': [
        
          'Name': 'Acme Co',
          'Products': [
            
              'Name': 'Anvil',
              'Price': 50
            
          ]
        ,
        
          'Name': 'Contoso',
          'Products': [
            
              'Name': 'Elbow Grease',
              'Price': 99.95
            ,
            
              'Name': 'Headlight Fluid',
              'Price': 4
            
          ]
        
      ]
    ");

List<JToken> manufactures = o.SelectTokens("Manufacturers");

我需要输出 JSON 字符串而不是 JToken 集合。

预期输出:


    "Manufacturers": [
        
            "Name": "Acme Co",
            "Products": [
                
                    "Name": "Anvil",
                    "Price": 50
                
            ]
        ,
        
            "Name": "Contoso",
            "Products": [
                
                    "Name": "Elbow Grease",
                    "Price": 99.95
                ,
                
                    "Name": "Headlight Fluid",
                    "Price": 4
                
            ]
        
    ]

有没有办法得到这样的输出?

【问题讨论】:

您是否正在从this answer 到How to perform partial object serialization providing “paths” using Newtonsoft JSON.NET 寻找类似JsonExtensions.RemoveAllExcept(this JObject obj, IEnumerable&lt;string&gt; paths) 的内容? 【参考方案1】:

这里有两种方法可以做到这一点: 您无法将其转换为您在提问时想要的确切 JSON,但您可以将其提取为实际形式,即在本例中为数组。见下文:

Working Example in Fiddle

using System;
using Newtonsoft.Json;
using Newtonsoft.Json.Linq;

public class Program

        public static JsonSerializer _serializer = new JsonSerializer();


    public static void Main()
    
        JObject o = JObject.Parse(@"
              'Stores': [
                'Lambton Quay',
                'Willis Street'
              ],
              'Manufacturers': [
                
                  'Name': 'Acme Co',
                  'Products': [
                    
                      'Name': 'Anvil',
                      'Price': 50
                    
                  ]
                ,
                
                  'Name': 'Contoso',
                  'Products': [
                    
                      'Name': 'Elbow Grease',
                      'Price': 99.95
                    ,
                    
                      'Name': 'Headlight Fluid',
                      'Price': 4
                    
                  ]
                
              ]
            ");

        Console.WriteLine("1. Print the key Value");
        Console.WriteLine(o["Manufacturers"].ToString());
        Console.WriteLine("--------");
        Console.WriteLine("2. Iterate and print by keyname - (Key - Value) ");

            foreach(var m in o)

                if(m.Key == "Manufacturers")
                Console.WriteLine(m.ToString());
            


    


另一个选项是你可以破解它 - 使用上面的示例提取字符串,然后在大括号之间添加字符串

var json = "" + extractedString + ""; 

【讨论】:

以上是关于如何使用 JSON 路径获取 JSON 字符串的一部分而不是 JToken?的主要内容,如果未能解决你的问题,请参考以下文章

Android:如何获取“serviceAccountCredentials.json”文件路径

如何将用户获取的文件路径保存在Json文件中?

如何在 MySQL/MariaDB 中将 LONGTEXT 字段作为 JSON 返回

如何使用 JSON 路径引用根键?

如何获取我在 StartUp 方法中添加的 JSON 文件的内容,以便在我的一项操作中使用它?

如何在Java中获取JSON路径的所有输出路径,以便通过它们的函数替换现有值