如何在 C# 中删除 Json 数据的标头名称

Posted

技术标签:

【中文标题】如何在 C# 中删除 Json 数据的标头名称【英文标题】:How to delete header name of Json data in C# 【发布时间】:2021-12-31 01:00:57 【问题描述】:

我正在尝试从 Json 格式的输出中删除此标头 "vendor": 和 分支。

删除的原因是将这三个字段名(“RECORDNO”..“NAME”)映射到SQL表中。

底部是预期的输出:

底部是 C# 代码,它遍历每个代码并填充结果,然后使用 JsonCovert 将输出格式化为 Json 格式。

public static string Run(ILogger logger)       
    
        OnlineClient client = Bootstrap.Client(logger);
        ReadByQuery query = new ReadByQuery()
        
            ObjectName = "VENDOR",
            PageSize = 600, 
            Fields =
            
                "RECORDNO",
                "VENDORID",
                "NAME"
            
        ;
        logger.LogInformation("Executing query to Intacct API");
        Task<OnlineResponse> task = client.Execute(query);
        task.Wait();            
        OnlineResponse response = task.Result;
        Result result = response.Results[0];
        LogManager.Flush();
        int i = 1;
        while (result.NumRemaining > 0 && i <= 1 && !string.IsNullOrEmpty(result.ResultId))
            
            i++;
            ReadMore more = new ReadMore()
            
                ResultId = result.ResultId
            ;
            Task<OnlineResponse> taskMore = client.Execute(more);
            taskMore.Wait();
            OnlineResponse responseMore = taskMore.Result;                
            Result resultMore = responseMore.Results[0];
            dynamic resultJson =   
                   JsonConvert.DeserializeObject(JsonConvert.SerializeObject(result.Data));  
            string resultJsonString = resultJson.ToString();  
            return resultJsonString;
        
        return "";
    

我不熟悉 C#,所以我不确定如何表达从“查询”中删除“供应商:”部分。

我确信这段 C# 代码中有很多不必要的行可以删除(清理)。

删除 "vendor": 和 分支的表达式是什么?


这是根据@Serge 的评论更新的代码。

int i = 1;
        while (result.NumRemaining > 0 && i <= 1 && !string.IsNullOrEmpty(result.ResultId))
            
            i++;
                            
            dynamic resultJson =   
                   JsonConvert.DeserializeObject(JsonConvert.SerializeObject(result.Data));  
            string resultJsonString = resultJson.ToString();

            var jsonArray = JArray.Parse(resultJsonString);
            var newJsonArray = jsonArray.SelectTokens("$..VENDOR");
            var result1 = JsonConvert.SerializeObject(newJsonArray, Newtonsoft.Json.Formatting.Indented);

            return result1;

        

我这样修改的时候,没有数据输出(如下图)。

[ ]

放置底部代码的正确方法(区域)是什么?

var jsonArray=JArray.Parse(json);  

var newJsonArray =  jsonArray.SelectTokens("$..VENDOR");
    
var result= JsonConvert.SerializeObject(newJsonArray, Newtonsoft.Json.Formatting.Indented);

【问题讨论】:

您可以在 SQL 中非常轻松地做到这一点:只需使用 OPENJSON(@YourJson) WITH (RECORDNO int '$.vendor.RECORDNO', ... 何必呢?只需按原样解析并从解析结果中获取您想要的信息 【参考方案1】:

您可以创建一个新的 JObject,为其分配“供应商”字段中可用的 JObject 值。

你可以这样做:

JObject changed =  jobj["vendor"].Value<JObject>();

这是一个例子:

JObject toChange = new JObject();
toChange["vendor"] = new JObject();
toChange["vendor"]["fieldA"] = "value";
toChange["vendor"]["fieldB"] = "value";

JObject changed = toChange["vendor"].Value<JObject>();
Console.WriteLine(toChange.ToString());
Console.WriteLine(changed.ToString());

从这里:


  "vendor": 
    "fieldA": "value",
    "fieldB": "value"
  

你会得到这个:


  "fieldA": "value",
  "fieldB": "value"

【讨论】:

【参考方案2】:

使用 Newtonsoft.Json 试试这个

using Newtonsoft.Json;
....

var json="[\"VENDOR\":\"RECORDNO\":\"1\",\"VENDORID\":\"ID1\",\"NAME\":\"Name1\",\"VENDOR\":\"RECORDNO\":\"2\",\"VENDORID\":\"ID2\",\"NAME\":\"Name2\",\"VENDOR\":\"RECORDNO\":\"3\",\"VENDORID\":\"ID3\",\"NAME\":\"Name3\"]"

 var jsonArray=JArray.Parse(json);  

 var newJsonArray =  jsonArray.SelectTokens("$..VENDOR");
        
 var result= JsonConvert.SerializeObject(newJsonArray, Newtonsoft.Json.Formatting.Indented);

结果

  [ 
    "RECORDNO": "1",
    "VENDORID": "ID1",
    "NAME": "Name1"
  ,
  
    "RECORDNO": "2",
    "VENDORID": "ID2",
    "NAME": "Name2"
  ,
  
    "RECORDNO": "3",
    "VENDORID": "ID3",
    "NAME": "Name3"
   ]

或者你可以创建类并输入 c# list

var jsonDeserialized=JsonConvert.DeserializeObject<VendorRoot[]>(json);

List<VENDOR> newJsonList = jsonDeserialized.Select(d => d.VENDOR ).ToList();

var result= JsonConvert.SerializeObject(newJsonList,  Newtonsoft.Json.Formatting.Indented);


public class VendorRoot

    public VENDOR VENDOR  get; set; 

public class VENDOR

    public string RECORDNO  get; set; 
    public string VENDORID  get; set; 
    public string NAME  get; set; 


【讨论】:

我尝试实现您提供的代码,并修改了原始帖子。我没有得到任何数据输出。你能给我一些反馈吗?谢谢。 请看我在原帖中提供的附加内容。 @Java 所有代码均使用 Visual Studio 和 c# 进行了测试。 Json 是您在白色图像中发布的对象。我不知道你是怎么知道的。获得 json 后,您可以使用我建议的代码。 我找到了原因。这是由于代码中的“供应商”被大写(“供应商”)所致。

以上是关于如何在 C# 中删除 Json 数据的标头名称的主要内容,如果未能解决你的问题,请参考以下文章

如何将带有自定义标头的任意 JSON 数据发送到 REST 服务器?

如何将 SOAP 标头附加到我的 C# 客户端?

C# 将自定义标头设置为 httpclient 会导致错误,因为标头名称被误用

如何从 C# Web 服务返回数据表/数据集作为 JSON

如何在 C# 中删除 Json 特定元素?

如何在 JSON 返回 C# 中删除列名