【问题标题】:How to delete header name of Json data in C#如何在 C# 中删除 Json 数据的标头名称
【发布时间】: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', ...
  • 何必呢?只需按原样解析并从解析结果中获取您想要的信息

标签: c# json


【解决方案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 后,您可以使用我建议的代码。
    • 我找到了原因。这是由于代码中的“供应商”被大写(“供应商”)所致。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-09-13
    • 1970-01-01
    • 2011-07-11
    相关资源
    最近更新 更多