【问题标题】:Construct JSON using C#使用 C# 构造 JSON
【发布时间】:2019-06-28 10:29:09
【问题描述】:

我正在为我的 Odata 端点调用的 POST 方法构建一个 JSON 主体,如下所示

 Newtonsoft.Json.Linq.JObject sample;
sample = new Newtonsoft.Json.Linq.JObject();

sample["status"] = "New";
sample[ "PROJECT@odata.bind"] = "["+"/PROJECT('" + prjBarcode + "')"+"]";

其中 PROJECT@odata.bind 是一个数组。我正在寻找像这样构建的 JSON

 "status": "New",
 "PROJECT@odata.bind":["/PROJECT('PJ1')"]

但我上面的代码生成的就像

  "PROJECT@odata.bind":"[/PROJECT('PJ1')]"

[]"" 中的位置我该如何解决这个问题

【问题讨论】:

  • sample是什么类型,json是怎么生成的?
  • 什么是sample
  • @Alexander 抱歉,我现在更新了我的问题
  • @DavidG 我已经更新了我的问题

标签: c# asp.net json asp.net-web-api


【解决方案1】:

您正在为PROJECT@odata.bind 键传递字符串值,您只需要传递一个数组

sample[ "PROJECT@odata.bind"] =  new JArray(new []{ "/PROJECT('" + prjBarcode + "')" });

或者你可以使用JArray构造函数的另一个重载

sample[ "PROJECT@odata.bind"] =  new JArray("/PROJECT('" + prjBarcode + "')");

【讨论】:

  • 我收到错误无法将类型'string[]'隐式转换为'Newtonsoft.Json.Linq.JToken'
【解决方案2】:

在 JSON 中,方括号 ([...]) 表示一个数组,因此需要创建一个,例如:

var array = new Newtonsoft.Json.Linq.JArray(new string[] {"/PROJECT('" + prjBarcode + "')" });
sample["PROJECT@odata.bind"] = array;

您还应该考虑使用interpolated strings,它使您的代码更具可读性:

var array = new Newtonsoft.Json.Linq.JArray(new string[] {"/PROJECT('{prjBarcode}')" });

不过,我一开始不会像这样构建 JSON。您应该创建一个与您的结构相匹配的具体类型并将其序列化。例如:

public class Data
{
    public string Status { get; set; }
    [JsonProperty("PROJECT@odata.bind")]
    public string[] Projects { get; set; }
}

var json = JsonConvert.SerializeObject(new Data
{ 
    Status = "New", 
    Projects = new string[] {$"/PROJECT('{prjBarcode}')" } 
});

【讨论】:

  • 我收到错误Cannot implicitly convert type 'string[]' to 'Newtonsoft.Json.Linq.JToken'
  • 已修复,并添加了更好的选项。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-08-20
  • 1970-01-01
  • 2021-01-14
  • 1970-01-01
  • 1970-01-01
  • 2010-09-18
  • 1970-01-01
相关资源
最近更新 更多