Bullgill Coder Ответов: 2

Как я могу получить значения из массива JSON в POST запрос в C# API-интерфейс


Привет, я пытаюсь получить значения адресов из простого запроса post в API, чтобы я мог прочитать их и заполнить таблицу SQL. Такие элементы, как имя и т.д., Я могу читать и записывать в базу данных, но у каждого человека есть 2 адреса, поэтому они находятся в json в виде массива (без квадратных скобок). Есть ли простой способ сделать это?

Что я уже пробовал:

Моя модель выглядит так

public class Customer
{
    // Properties of Create Customer with Get/Set
    public int customer_number { get; set; } // mandatory
    public string prefix { get; set; } // not mandatory
    public string firstname { get; set; } // mandatory
    public string surname { get; set; } // mandatory
    public string type { get; set; } // mandatory -- address type "Billing | Shipping"
    public string line_1 { get; set; } // mandatory
    public string line_2 { get; set; } // not mandatory
    public string line_3 { get; set; } // not mandatory
    public string city { get; set; } // not mandatory
    public string county { get; set; } //not mandatory
    public string post_code { get; set; } //mandatory
    public string country { get; set; } // not mandatory
    public char email_opt_in { get; set; } // mandatory
}

public class CreateCustomer : Customer
{
}


и мой контроллер вот такой.

// POST api/<controller>
 public HttpResponseMessage Post([FromBody]CreateCustomer value)
 {
     _conCust = new SqlConnection(ConfigurationManager.ConnectionStrings["CAR_Connection"].ConnectionString);
     _conCust.Open();

     var a_query = "insert into cust ( Title, FirstName, Surname, Address1, Address2, Address3, Town, County, Country, " +
         "PostCode, Tel, Mobile, ACCreateDate, CreatedBy, CreatedDate, CreatedMachine) values " +
         "(@Title, @First, @Surname, @Add1, @Add2, @Add3, @Town, @County, @Country, @PostCode, @Tel, @Mobile, CONVERT(VARCHAR(10), getdate(), 111), " +
         "'WebAPI', getdate(), 'AUTOMATED') ";
     SqlCommand a_insertcommand = new SqlCommand(a_query, _conCust);
     a_insertcommand.Parameters.AddWithValue("@Title", value.prefix);
     a_insertcommand.Parameters.AddWithValue("@First", value.firstname);
     a_insertcommand.Parameters.AddWithValue("@Surname", value.surname);
     a_insertcommand.Parameters.AddWithValue("@Add1", ""); //value.line_1);
     a_insertcommand.Parameters.AddWithValue("@Add2", ""); // value.line_2);
     a_insertcommand.Parameters.AddWithValue("@Add3", ""); // value.line_3);
     a_insertcommand.Parameters.AddWithValue("@Town", ""); // value.city);
     a_insertcommand.Parameters.AddWithValue("@County", ""); // value.county);
     a_insertcommand.Parameters.AddWithValue("@Country", ""); // value.country);
     a_insertcommand.Parameters.AddWithValue("@PostCode", value.post_code[1]);
     a_insertcommand.Parameters.AddWithValue("@Tel", ""); // value.phone_number);
     a_insertcommand.Parameters.AddWithValue("@Mobile", ""); //  value.mobile_number);


     int a_result = a_insertcommand.ExecuteNonQuery();


На данный момент, чтобы проверить правильность сохранения имени, я закомментировал значения адресов, вставив вместо них только пустую строку.

Я знаю, что мне просто не хватает чего-то простого!

Почтовый запрос был бы похож на этот...

{
  "customer_number": 1,
  "prefix": "Mr",
  "firstname": "Test",
  "surname": "User",
  "billing_address": {
    "type": "Billing",
    "line_1": "Street 1",
    "line_2": "Street 2",
    "line_3": "Street 3",
    "city": "AnyTown",
    "county": "Cumbria",
    "post_code": "CA1 4TY",
    "country": "GB",
    "is_default": "1"
  },
  "shipping_address": {
    "type": "Shipping",
    "line_1": "Street 1",
    "line_2": "Street 2",
    "line_3": "Street 3",
    "city": "Town",
    "county": "Cumbria",
    "post_code": "CA1 4TY",
    "country": "GB",
    "is_default": "0"
  },
  "email_opt_in": "0|1"
}


Мы будем признательны за любые рекомендации.

2 Ответов

Рейтинг:
7

F-ES Sitecore

Вы рассматриваете свойства в json, которые являются другими объектами, как свойства в ваших классах c#, которые являются классами, соответствующими значениям свойства. Таким образом, в вашем случае есть класс Address, который имеет поля для адресов и добавляет свойство shipping_address и billing_address

public class Address
{
    public string type { get; set; } // mandatory -- address type "Billing | Shipping"
    public string line_1 { get; set; } // mandatory
    public string line_2 { get; set; } // not mandatory
    public string line_3 { get; set; } // not mandatory
    public string city { get; set; } // not mandatory
    public string county { get; set; } //not mandatory
    public string post_code { get; set; } //mandatory
    public string country { get; set; } // not mandatory
}

public class Customer
{
    // Properties of Create Customer with Get/Set
    public int customer_number { get; set; } // mandatory
    public string prefix { get; set; } // not mandatory
    public string firstname { get; set; } // mandatory
    public string surname { get; set; } // mandatory
    public char email_opt_in { get; set; } // mandatory
    public Address billing_address { get; set; }
    public Address shipping_address { get; set; }
}


Когда вы deserialise ваш формат JSON это позволит создать и заполнить соответствующие поля адреса с данных из формата JSON.


Garth J Lancaster

Мне очень нравится, что вы упростили два сгенерированных "адреса", то есть BillingAddress и ShippingAddress - я все время забываю это сделать ...

Bullgill Coder

Спасибо вам обоим.

Я изменил свой класс на аналогичный вышеприведенному. Я думаю, что это было моим самым большим камнем преткновения, и в моем контроллере я теперь добавил параметры в свою строку SQL. До сих пор я тестировал только почтовый индекс, но он успешно записывает данные в мою таблицу SQL.

a_insertcommand.Параметры.AddWithValue("@почтовый индекс", value.billing_address.post_code);

Рейтинг:
13

Garth J Lancaster

не совсем понимаю, что вы имеете в виду.

Цитата:
таким образом, они находятся в JSON в виде массива (без квадратных скобок).
. это либо правильный JSON, либо нет, иначе стукните человека, который владеет API, и скажите ему, чтобы он заострился !! (Очень трудно работать с ублюдочным псевдо-JSON)

Если ваш JSON отформатирован правильно, то с помощью инструмента JSON to CSharp, например Конвертировать JSON в классы C# онлайн - Json2CSharp Toolkit[^] обычно вы получаете схему и "корневой" объект, который в вашем случае будет содержать что-то вроде
public class Root 
{
  ...
  List<Customer> customers {get; set;}
  ...
}
а потом вы используете десериализацию
Root myDeserializedClass = JsonConvert.DeserializeObject(myJsonResponse);


Если ваш JSON "правильный", то сгенерированный класс C# должен иметь адрес выставления счетов и адрес доставки в качестве отдельных сущностей - customer.billing_address.type vs customer.shipping_address.type-похоже, ваша модель неверна, она не соответствует фрагменту json, который вы показываете

[Edit] из вашего фрагмента JSON я сгенерировал эту модель
// Root myDeserializedClass = JsonConvert.DeserializeObject<Root>(myJsonResponse); 
    public class BillingAddress    {
        public string type { get; set; } 
        public string line_1 { get; set; } 
        public string line_2 { get; set; } 
        public string line_3 { get; set; } 
        public string city { get; set; } 
        public string county { get; set; } 
        public string post_code { get; set; } 
        public string country { get; set; } 
        public string is_default { get; set; } 
    }

    public class ShippingAddress    {
        public string type { get; set; } 
        public string line_1 { get; set; } 
        public string line_2 { get; set; } 
        public string line_3 { get; set; } 
        public string city { get; set; } 
        public string county { get; set; } 
        public string post_code { get; set; } 
        public string country { get; set; } 
        public string is_default { get; set; } 
    }

    public class Root    {
        public int customer_number { get; set; } 
        public string prefix { get; set; } 
        public string firstname { get; set; } 
        public string surname { get; set; } 
        public BillingAddress billing_address { get; set; } 
        public ShippingAddress shipping_address { get; set; } 
        public string email_opt_in { get; set; } 
    }
[/Редактировать]