web-dev-qa-db-ja.com

C#オブジェクトをJSONオブジェクトに変換する

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文字列をオブジェクトに追加または挿入するにはどうすればよいですか?

8
Mowrite

最初に正しい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シリアライザーを選択する必要があります。たとえば、 DataContractJsonSerializer または Json.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"
  }
}
17

別の方法。

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
granadaCoder

Newtonsoft.Json NuGetをインストールしてから、Jsonシリアライザーに顧客クラスフィールドをシリアル化する方法を指示するために、必要な名前の装飾でCustomerクラスを装飾します。

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の値は次のようになります。"{\"jsonCreditApplication\":{\"gors_descr\":\"Appliances \",\"b_name_first\":\"Marisol \",\"b_name_last\":\"Testcase \"}}"

これを行うには多くの方法がありますが、私はこれが最も簡単な解決策であると信じています。

1
Zuhair

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を使用して独自に作成することをお勧めします。お役に立てば幸いです!

0
Benj Arnopp