Десериализация строки PHP json-code (json_encode) с веб-сервисами ASP.NET - PullRequest
1 голос
/ 23 февраля 2011

Я действительно борюсь за десериализацию строки, закодированной в json-код PHP, в ASP.NET.

Я использую nusoap и CakePHP 1.3 на стороне PHP и mvc.net 4.0 на веб-сервисесторона и все работало хорошо.Однако я не мог понять, как передать сложный массив как один из параметров веб-сервиса, поэтому у меня была идея сериализовать его как json и передать простую строку.Пока все хорошо ...

Но я не могу на всю жизнь десериализовать строку json_encoded в ASP.NET [ну, я пытался, по крайней мере, последние два часа;)]

Вот что у меня есть:

PHP отправляет массив продуктов (идентификатор продукта в виде GUID - отправляется в виде строки, затем преобразуется на стороне веб-службы) и количество продуктов:

$args['products'] = json_encode($booking['Booking']['prs_products']);

Это нормально воспринимается веб-службой как следующая строка json (продукты):

[{"BookingProducts": {"id": "2884f556-67ed-4eb8-98ca-a99dc27a2665" , "количество": 2}}, { "BookingProducts": { "ID": "f57854ba-0a9b-400b-bea0-bafdcb179b01", "количество": 2}}, { "BookingProducts": {"id": "7ff81128-c33c-4e6c-a33c-3ca40ccfb5d0", "amount": 2}}]

Затем я пытаюсь заполнить список BookingProducts <>.Класс BookingProducts выглядит следующим образом:

public class BookingProducts
    {
        public String id { get; set; }
        public int quantity { get; set; }

        public BookingProducts()
        {
        }

        public BookingProducts(string id, int quantity)
        {
            this.id = id;
            this.quantity = quantity;
        }
    }

Я пробовал обе библиотеки [System.Web.Script.Serialization] [2] и Newtonsoft.Json следующим образом, но безуспешно:

List<BookingProducts> productsList = new List<BookingProducts>();

try
{
  productsList = JsonConvert.DeserializeObject<List<BookingProducts>>((products));
}
catch (Newtonsoft.Json.JsonSerializationException)
{
  productsList = new JavaScriptSerializer().Deserialize<List<BookingProducts>>(products);                   
}

В обоих случаях я получаю список пустых продуктов (или исключение сериализации).

Надеюсь, кто-то уже делал это раньше или может заметить очевидную ошибку!

1 Ответ

0 голосов
/ 23 февраля 2011

Здесь у вас есть список объектов, содержащих объект BookingProducts.Чтобы десериализовать его, вам нужно иметь что-то подобное для вашей сущности:

public class BookingProductsWrapper
{
    public class BookingProductsInner
    {
        public string id { get; set; }

        public int quantity { get; set; }
    }

    public BookingProductsInner BookingProducts { get; set; }
}

Теперь вы можете десериализовать его с помощью JavaScriptSerializer (например):

System.Web.Script.Serialization.JavaScriptSerializer jsSerializer = new System.Web.Script.Serialization.JavaScriptSerializer();
List<BookingProductsWrapper> productsList = jsSerializer.Deserialize<List<BookingProductsWrapper>>(products);

Это будет делатьтрюк.

...