web-dev-qa-db-fra.com

Convertir un objet C # en un objet Json

J'essaie de sérialiser un objet C # dans un objet Json. Ces informations seront ensuite soumises à l'API Salesforce et créeront une application. À l'heure actuelle, l'objet C # est sérialisé dans une chaîne Json, mais j'ai besoin que ce soit un objet. 

Voici mon objet C # accompagné de la sérialisation. 

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;

J'ai besoin de la chaîne JSON pour sortir à l'intérieur d'un objet JSON. Un exemple de ce dont j'ai besoin est ci-dessous: 

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

Cette chaîne json codée en dur est à l'intérieur d'un objet. Dans l'état actuel des choses, les valeurs de l'objet C # sont exportées dans une chaîne JSON, mais j'ai besoin de le faire dans un objet pour que l'API Salesforce accepte la soumission. 

Comment puis-je ajouter ou insérer la chaîne JSON dans un objet? 

7
Mowrite

Pour créer le bon JSON, vous devez d’abord préparer le modèle approprié. Cela peut être quelque chose comme ça:

[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; }
}

Pour pouvoir utiliser les attributs Data, vous devez choisir un autre sérialiseur JSON. Par exemple DataContractJsonSerializer ou Json.NET (je vais l'utiliser dans cet exemple).

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


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

Donc, la variable jsonCreditApplication sera:

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

Autrement.

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; }

    }
}

et

        /* 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
            });

voir

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

Mon packages.config au moment de l'écriture ... bien que je sois sûr que les futures/dernières versions le supporteront toujours:

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

Installez Newtonsoft.Json NuGet puis décorez la classe Client avec les décorations de dénomination requises pour indiquer à Json sérialiseur comment sérialiser les champs de la classe client:

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

Ensuite, sérialisez l'objet comme ceci:

Customer application = new Customer
        {
            ProductDescription = "Appliances ",
            Fname = "Marisol ",
            Lname = "Testcase "

        };
        var JsonOutput = JsonConvert.SerializeObject(new { jsonCreditApplication = application });

Vous obtiendrez le résultat souhaité et la valeur de JsonOutput sera: "{\"jsonCreditApplication\":{\"gors_descr\":\"Appliances \",\"b_name_first\":\"Marisol \",\"b_name_last\":\"Testcase \"}}" 

Il y a plusieurs façons de procéder mais je pense que celle-ci est la solution la plus simple.

1
Zuhair

Vous pouvez utiliser quelque chose comme http://restsharp.org/ , qui est une bibliothèque c # pour REST. Si tel est le cas, il possède un sérialiseur intégré pour les objets json (.addJsonBody ()) ou vous pouvez le sérialiser vous-même et l'ajouter avec 

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

Alternativement, si vous voulez plus de contrôle, vous pouvez utiliser

    System.Net.HttpWebRequest()

J'ai également trouvé https://github.com/ademargomes/JsonRequest , mais il est toujours en développement . Soyez averti que si vous utilisez quelque chose comme RestSharp, il s'agit d'une demande prédéfinie elles ont créé des requêtes standard (par exemple, des en-têtes multipart/form avec des en-têtes personnalisés ou même une authentification personnalisée) peuvent ne pas fonctionner avec leur bibliothèque. Dans ce cas, il est probablement préférable de créer vos propres requêtes avec HttpWebRequest. J'espère que cela pourra aider!

0
Benj Arnopp