如何在 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 服务器?