Конвертировать объект C# в объект Json

Я пытаюсь сериализовать объект C# в объект Json. Затем он будет отправлен в API Salesforce и создаст приложение. Сейчас у меня есть объект 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 в объект?

4 ответа

Решение

Для создания правильного 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"
  }
}
using System; 
using Newtonsoft.Json; 
using Newtonsoft.Json.Linq;

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

Установите Newtonsoft.Json NuGet, затем украсьте класс Customer требуемыми украшениями именования, чтобы сообщить сериализатору Json, как сериализовать поля класса клиента:

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 \"}}"

Есть много способов сделать это, но я считаю, что это самое простое решение.

По-другому.

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

Мой package.config на момент написания... хотя я уверен, что будущие / последние версии все еще будут поддерживать его:

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

Вы можете использовать что-то вроде http://restsharp.org/, которая является библиотекой aC# для REST. Если это так, он имеет встроенный сериализатор для объектов json (.addJsonBody()) или вы можете сериализовать его самостоятельно и добавить с помощью

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

В качестве альтернативы, если вы хотите больше контроля над ним, вы можете использовать

    System.Net.HttpWebRequest()

Я также нашел https://github.com/ademargomes/JsonRequest, но он все еще находится в разработке. Имейте в виду, что если вы используете что-то вроде RestSharp, это постоянный запрос, поэтому любые отклонения от того, что они создали в качестве стандартных запросов (например, данные multipart / form с json или пользовательские заголовки или даже пользовательская аутентификация), могут не работать с их библиотекой в этом случае, вероятно, лучше все-таки создать свой собственный, используя HttpWebRequest. Надеюсь, это поможет!

Другие вопросы по тегам