Кодировать JSON с помощью пользовательских имен - PullRequest
0 голосов
/ 24 мая 2018

Я хочу сделать POST-запрос к API Hubspot (https://developers.hubspot.com/docs/methods/contacts/create_or_update), и мне нужен JSON для соответствия этому формату:

{ "properties": [ { "property": "firstname", "value": "HubSpot" } ] }

Вместо этого я получаю это:

{ "properties": [ { "Key": "email", "Value": "alphatest@baconcompany.com" }, { "Key": "firstname", "Value": "testfirstname" } ] }

Вместо «свойства» и «значения» мой код генерирует «Ключ» и «Значение», как я могу изменить свой JSON, чтобы он соответствовал нужному формату?

Вот как я генерирую этот словарь:

    public class HubspotContact
    {
        public Dictionary<string, string> properties { get; set; }
    }

    private static readonly HttpClient client = new HttpClient();

    class DictionaryAsArrayResolver : DefaultContractResolver
    {
        protected override JsonContract CreateContract(Type objectType)
        {
            if (objectType.GetInterfaces().Any(i => i == typeof(IDictionary) ||
               (i.IsGenericType && i.GetGenericTypeDefinition() == typeof(IDictionary<,>))))
            {
                return base.CreateArrayContract(objectType);
            }

            return base.CreateContract(objectType);
        }
    }

И вот как я генерирую JSON:

HubspotContact foo = new HubspotContact();
foo.properties = new Dictionary<string, string>();
foo.properties.Add("email", "alphatest@baconcompany.com");
foo.properties.Add("firstname", "firstname");

JsonSerializerSettings settings = new JsonSerializerSettings();
settings.Formatting = Formatting.Indented;
settings.ContractResolver = new DictionaryAsArrayResolver();

string json = JsonConvert.SerializeObject(foo, settings);

Наконец, вот как я отправляю свой запрос:

    var httpWebRequest =(HttpWebRequest)WebRequest.Create("https://api.hubapi.com/contacts/v1/contact/createOrUpdate/email/alphatest@baconcompany.com/?hapikey=myapikey");
httpWebRequest.ContentType = "application/json";
httpWebRequest.Method = "POST";

        using (var streamWriter = new StreamWriter(httpWebRequest.GetRequestStream())){
            streamWriter.Write(json);
            streamWriter.Flush();
            streamWriter.Close();
        }

        var httpResponse = (HttpWebResponse)httpWebRequest.GetResponse();
        using (var streamReader = new StreamReader(httpResponse.GetResponseStream()))
        {
            var result = streamReader.ReadToEnd();
            Console.WriteLine(result.ToString());
        }

Прямо сейчас сзапрос, как я получаю эту ошибку:

System.Net.WebException: 'The remote server returned an error: (400) Bad Request.'

Ответы [ 2 ]

0 голосов
/ 24 мая 2018

Измените HubspotContact на это:

class PropertyValue
{
    public string Property { get;set;}
    public string Value { get;set;}
}
class HubspotContact
{
    public List<PropertyValue> Properties {get;set;}
}

Он должен сериализоваться в надлежащий формат и не требует специального сериализатора.

0 голосов
/ 24 мая 2018

Сериализатор Json в C # не поддерживает произвольное именование свойств, исходящих из какой-либо общей структуры данных ...

Попробуйте заменить словарь пользовательским классом, содержащим вместо этого свойства "property" и "value".

...