【问题标题】:Add value in json in each records在每条记录的 json 中添加值
【发布时间】:2021-10-01 05:53:36
【问题描述】:

我的 json 格式如下。因为我有多个记录,请检查下面的 json。

{
   "metadata":{
      "TotalCount":11,
      "CurrentPageNumber":1,
   },
   "records":[
      {
         "offerId":"e1b75d86-67b1-4557-a381-5474383da3fb",
         "isContract":true,
         "transportRouteId":"e1b75d86-67b1-4557-a381-5474383da3fb",
         "transportOrderId":"SEZYMY-210720-010097",
         "schedule":null,
      },
]
}

现在我想在每个 this 记录数组中添加新值,我该怎么做。

我想添加这个值:("carrierExpiredDate", (carrierExpiredDate.ComplianceExpiryDate.Value).Date);

所以这个新的 json 应该是这样的。

{
   "metadata":{
      "TotalCount":11,
      "CurrentPageNumber":1,
   },
   "records":[
      {
         "offerId":"e1b75d86-67b1-4557-a381-5474383da3fb",
         "isContract":true,
         "transportRouteId":"e1b75d86-67b1-4557-a381-5474383da3fb",
         "transportOrderId":"SEZYMY-210720-010097",
         "schedule":null,
         "carrierExpiredDate": (carrierExpiredDate.ComplianceExpiryDate.Value).Date)
      },
]
}

【问题讨论】:

  • 你在写入 Json 文件吗?它存储在哪里?
  • @ziakhan 我以这种方式获取 json 字符串:var json = await response.Content.ReadAsStringAsync();

标签: c# arrays asp.net json .net


【解决方案1】:
var json = 
    @"{
   "metadata":{
      "TotalCount":11,
      "CurrentPageNumber":1,
   },
   "records":[
      {
         "offerId":"e1b75d86-67b1-4557-a381-5474383da3fb",
         "isContract":true,
         "transportRouteId":"e1b75d86-67b1-4557-a381-5474383da3fb",
         "transportOrderId":"SEZYMY-210720-010097",
         "schedule":null
      },
]
}";    

var jObject = JObject.Parse(json);
var jList=jObject["records"].Children().ToList();
foreach(var jtoken in jList)
{
   jtoken["carrierExpiredDat"] = (carrierExpiredDate.ComplianceExpiryDate.Value).Date));
}
   string output = Newtonsoft.Json.JsonConvert.SerializeObject(jObject, Newtonsoft.Json.Formatting.Indented);

【讨论】:

  • 在foreach循环之后我需要在json字符串中再次转换它,因为我尝试了你的代码但没有在当前json字符串中添加新节点。
  • 查看编辑后的答案。检查输出是否包含您的新密钥。
  • 输出按预期工作。检查在你身边。
【解决方案2】:

试试这个。代码使用 Visual Studio 和 Postman 进行了测试

.....
var expDate=DateTime.Now;

var json = await response.Content.ReadAsStringAsync()
var deserializedJson = JsonConvert.DeserializeObject<TransportRoot>(json);
deserializedJson.Records.ForEach(i=> i.carrierExpiredDate=expDate);
var newJson= JsonConvert.SerializeObject(deserializedJson);

   public class Metadata
   {
       public int TotalCount { get; set; }
       public int CurrentPageNumber { get; set; }
   }

   public class Record
   {
       public string offerId { get; set; }
       public bool isContract { get; set; }
       public string transportRouteId { get; set; }
       public string transportOrderId { get; set; }
       public object schedule { get; set; },
     public object carrierExpiredDate { get; set; }
   }

   public class TransportRoot
   {
       public Metadata Metadata { get; set; }
       public List<Record> Records { get; set; }
   }

如果您对驼峰式 json 有问题,我强烈建议您更改启动方式

    services.AddControllers()
   // or services.AddControllersWithViews()
            .AddNewtonsoftJson(options =>
            options.SerializerSettings.ContractResolver =
            new CamelCasePropertyNamesContractResolver());

【讨论】:

  • 我收到此错误:JObject 不包含“记录”的定义
  • @Nic 你用过我的课吗?这段代码已经过测试,一切正常。而且我不知道什么是JObject。我没有我的代码。请解释一下。
  • @Nic 可能是大小写问题。阅读我的答案,或者如果您不希望这样做,请将 Records 更改为 records ,并将 Metadata 更改为我的课程中的元数据
猜你喜欢
  • 1970-01-01
  • 2021-05-12
  • 1970-01-01
  • 2011-08-19
  • 2017-11-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多