将C#对象转换为Json对象

时间:2016-01-18 18:58:15

标签: c# json api serialization

我正在尝试将C#对象序列化为Json对象。然后将其提交给Salesforce API,并创建一个应用程序。现在我将C#对象序列化为Json字符串,但我需要它作为一个对象。

这是我的C#对象以及伴随序列化。

Customer application = new Customer { 
    ProductDescription = "gors_descr " + tbDescription.Text, 
    Fname = "b_name_first " + tbFName.Text, 
    Lname = "b_name_last " + tbLName.Text
};

var json = new System.Web.Script.Serialization.JavaScriptSerializer();
string jsonString = json.Serialize(application);

string endPoint = token.instance_url + "/services/apexrest/submitApplication/";    
string response = conn.HttpPost(endPoint, json, token);
Literal rLiteral = this.FindControl("resultLiteral") as Literal;

我需要在JSON对象内输出JSON字符串。我需要的一个例子如下:

"{ \"jsonCreditApplication\" : " +
    "\"gors_descr\" : \"Appliances\", " +
    "\"b_name_first\" : \"Marisol\", " +
    "\"b_name_last\" : \"Testcase\", " +
"}"; 

此硬编码的json字符串位于对象内部。按照目前的情况,C#对象中的值将输出到JSON字符串中,但我需要将其输出到对象中,以便Salesforce API接受提交。

如何将JSON字符串追加或插入对象?

5 个答案:

答案 0 :(得分:16)

要首先创建正确的JSON,您需要准备适当的模型。它可以是这样的:

[DataContract]
public class Customer
{
    [DataMember(Name = "gors_descr")]
    public string ProductDescription { get; set; }

    [DataMember(Name = "b_name_first")]
    public string Fname { get; set; }

    [DataMember(Name = "b_name_last")]
    public string Lname { get; set; }
}

为了能够使用Data属性,您需要选择其他一些JSON序列化程序。例如DataContractJsonSerializerJson.NET(我将在此示例中使用它)。

Customer customer = new Customer
{
    ProductDescription = tbDescription.Text,
    Fname = tbFName.Text,
    Lname = tbLName.Text
};


string creditApplicationJson = JsonConvert.SerializeObject(
    new
    {
        jsonCreditApplication = customer
    });

所以jsonCreditApplication变量将是:

{
  "jsonCreditApplication": {
    "gors_descr": "Appliances",
    "b_name_first": "Marisol",
    "b_name_last": "Testcase"
  }
}

答案 1 :(得分:2)

另一种方式。

using System;
using Newtonsoft.Json;

namespace MyNamepace
{
    public class MyCustomObject
    {
        public MyCustomObject()
        {
        }

        [JsonProperty(PropertyName = "my_int_one")]
        public int MyIntOne { get; set; }

        [JsonProperty(PropertyName = "my_bool_one")]
        public bool MyBoolOne { get; set; }

    }
}

        /* using Newtonsoft.Json; */

        MyCustomObject myobj = MyCustomObject();
        myobj.MyIntOne = 123;
        myobj.MyBoolOne = false;

        string jsonString = JsonConvert.SerializeObject(
            myobj,
            Formatting.None,
            new JsonSerializerSettings()
            {
                ReferenceLoopHandling = Newtonsoft.Json.ReferenceLoopHandling.Ignore
            });

http://www.newtonsoft.com/json/help/html/T_Newtonsoft_Json_JsonSerializerSettings.htm

撰写本文时我的packages.config ...虽然我确定未来/最新版本仍将支持它:

<?xml version="1.0" encoding="utf-8"?>
<packages>
  <package id="Newtonsoft.Json" version="6.0.8" targetFramework="net45" />
</packages>

答案 2 :(得分:1)

安装Newtonsoft.Json的NuGet然后用require命名修饰来装饰Customer类,以告诉Json序列化程序如何序列化Customer类字段:

for

接下来,像这样序列化对象:

public class Customer
{
    [JsonProperty("gors_descr")]
    public string ProductDescription;
    [JsonProperty("b_name_first")]
    public string Fname;
    [JsonProperty("b_name_last")]
    public string Lname;
}

您将获得所需的结果,Customer application = new Customer { ProductDescription = "Appliances ", Fname = "Marisol ", Lname = "Testcase " }; var JsonOutput = JsonConvert.SerializeObject(new { jsonCreditApplication = application }); 的值为: JsonOutput

有很多方法可以做到这一点,但我相信这是最简单的解决方案。

答案 3 :(得分:0)

您可以使用类似http://restsharp.org/的内容,这是REST的c#库。如果是这样,它有一个用于json对象的内置序列化器(.addJsonBody()),或者你可以自己序列化并添加

    request.AddParameter("application/json; charset=utf-8", json, ParameterType.RequestBody);

或者,如果您想要更多地控制它,可以使用

    System.Net.HttpWebRequest()

我也发现了https://github.com/ademargomes/JsonRequest,但它仍处于开发阶段。 请注意,如果您使用RestSharp之类的东西,它是一个预制请求,因此它们作为标准请求所创建的内容(例如,带有json或自定义标头的多部分/表单数据甚至自定义身份验证)的任何变化都可能无法与其库一起使用,在这种情况下,无论如何最好自己使用HttpWebRequest。希望有所帮助!

答案 4 :(得分:0)

using System; 
using Newtonsoft.Json; 
using Newtonsoft.Json.Linq;

CurrentUTCDateTime yourObject = new CurrentUTCDateTime(); 
JObject json = JObject.Parse(JsonConvert.SerializeObject(yourObject));