Eugene Eugene - 1 month ago 13
C# Question

Recycler View (Xamarin Android )

I writing app for Android using Xamarin.

I try to make recycler view.

Here is my json : http://pastebin.com/rL214a2T

I have classes like this:

public class Billing
{
public string first_name { get; set; }
public string last_name { get; set; }
public string company { get; set; }
public string address_1 { get; set; }
public string address_2 { get; set; }
public string city { get; set; }
public string state { get; set; }
public string postcode { get; set; }
public string country { get; set; }
public string email { get; set; }
public string phone { get; set; }
}

public class Shipping
{
public string first_name { get; set; }
public string last_name { get; set; }
public string company { get; set; }
public string address_1 { get; set; }
public string address_2 { get; set; }
public string city { get; set; }
public string state { get; set; }
public string postcode { get; set; }
public string country { get; set; }
}

public class Result
{
public int id { get; set; }
public int parent_id { get; set; }
public string status { get; set; }
public string order_key { get; set; }
public int number { get; set; }
public string currency { get; set; }
public string version { get; set; }
public bool prices_include_tax { get; set; }
public string date_created { get; set; }
public string date_modified { get; set; }
public int customer_id { get; set; }
public string discount_total { get; set; }
public string discount_tax { get; set; }
public string shipping_total { get; set; }
public string shipping_tax { get; set; }
public string cart_tax { get; set; }
public string total { get; set; }
public string total_tax { get; set; }
//public List<Billing> billing { get; set; }
public Billing billing { get; set; }
public Shipping shipping { get; set; }
public string payment_method { get; set; }
public string payment_method_title { get; set; }
public string transaction_id { get; set; }
public string customer_ip_address { get; set; }
public string customer_user_agent { get; set; }
public string created_via { get; set; }
public string customer_note { get; set; }
public string date_completed { get; set; }
public string date_paid { get; set; }
public string cart_hash { get; set; }
public List<object> line_items { get; set; }
public List<object> tax_lines { get; set; }
public List<object> shipping_lines { get; set; }
public List<object> fee_lines { get; set; }
public List<object> coupon_lines { get; set; }
public List<object> refunds { get; set; }
}

public class RootObject
{
public List<Result> results { get; set; }
}


I writing class like this:

using System;
using System.Collections.Generic;
using System.Net.Http;
using System.Net.Http.Headers;
using System.Threading.Tasks;
using ModernHttpClient;
using Newtonsoft.Json;

namespace StarWars.Api.Repository
{
public class MoviesRepository
{
public async Task<RootObject> GetAllFilms()
{
var httpClient = GetHttpClient();

var response = await httpClient.GetAsync(ServiceEndPoints.StartWarsApiBaseUri).ConfigureAwait(false);

if (response.IsSuccessStatusCode)
{
var content = response.Content;

string jsonString = await content.ReadAsStringAsync().ConfigureAwait(false);


return JsonConvert.DeserializeObject<RootObject>(jsonString);
}
return new RootObject();
}

private HttpClient GetHttpClient()
{
var httpClient = new HttpClient(new NativeMessageHandler())
{
BaseAddress = new Uri(ServiceEndPoints.StartWarsApiBaseUri)
};


httpClient.DefaultRequestHeaders.Accept.Clear();

httpClient.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));

return httpClient;
}
}

public class ServiceEndPoints
{
public static readonly string StartWarsApiBaseUri = "http://api.simplegames.com.ua/index.php/?wc_orders=processing_orders";
// public static readonly string GetFilmsUri = "films";
}
}


But when I try to launch app I have this error

Newtonsoft.Json.JsonSerializationException: Cannot deserialize the current JSON array (e.g. [1,2,3]) into type 'StarWars.Api.Repository.RootObject' because the type requires a JSON object (e.g. {"name":"value"}) to deserialize correctly.

To fix this error either change the JSON to a JSON object (e.g. {"name":"value"}) or change the deserialized type to an array or a type that implements a collection interface (e.g. ICollection, IList) like List<T> that can be deserialized from a JSON array. JsonArrayAttribute can also be added to the type to force it to deserialize from a JSON array.


As I understood I need to set

How I can fix it?

UPDATE

Using Resharper I remake code like this

public async Task<List<RootObject>> GetAllFilms()
{
var httpClient = GetHttpClient();

var response = await httpClient.GetAsync(ServiceEndPoints.StartWarsApiBaseUri).ConfigureAwait(false);

if (response.IsSuccessStatusCode)
{
var content = response.Content;

string jsonString = await content.ReadAsStringAsync().ConfigureAwait(false);


return JsonConvert.DeserializeObject<List<RootObject>>(jsonString);
}
return new List<RootObject>();
}

private HttpClient GetHttpClient()
{
var httpClient = new HttpClient(new NativeMessageHandler())
{
BaseAddress = new Uri(ServiceEndPoints.StartWarsApiBaseUri)
};


httpClient.DefaultRequestHeaders.Accept.Clear();

httpClient.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));

return httpClient;
}
}

public class ServiceEndPoints
{
public static readonly string StartWarsApiBaseUri = "http://api.simplegames.com.ua/index.php/?wc_orders=processing_orders";
// public static readonly string GetFilmsUri = "films";
}


}

But i have error in my MainActivity in this row
var moviesAdapter = new MovieAdapter(films.results)


Here is error

Error CS1061 'List' does not contain a definition for 'results' and no extension method 'results' accepting a first argument of type 'List' could be found (are you missing a using directive or an assembly reference?)

mww mww
Answer

You need change your model classes, If you don't know how should be look your model classes you can use tool like json2sharp. You can't deserialize JSON using your classes. Use this classes instead your.

public class Billing
{
    public string first_name { get; set; }
    public string last_name { get; set; }
    public string company { get; set; }
    public string address_1 { get; set; }
    public string address_2 { get; set; }
    public string city { get; set; }
    public string state { get; set; }
    public string postcode { get; set; }
    public string country { get; set; }
    public string email { get; set; }
    public string phone { get; set; }
}

public class Shipping
{
    public string first_name { get; set; }
    public string last_name { get; set; }
    public string company { get; set; }
    public string address_1 { get; set; }
    public string address_2 { get; set; }
    public string city { get; set; }
    public string state { get; set; }
    public string postcode { get; set; }
    public string country { get; set; }
}

public class LineItem
{
    public int id { get; set; }
    public string name { get; set; }
    public string sku { get; set; }
    public int product_id { get; set; }
    public int variation_id { get; set; }
    public int quantity { get; set; }
    public string tax_class { get; set; }
    public string price { get; set; }
    public string subtotal { get; set; }
    public string subtotal_tax { get; set; }
    public string total { get; set; }
    public string total_tax { get; set; }
    public List<object> taxes { get; set; }
    public List<object> meta { get; set; }
}

public class ShippingLine
{
    public int id { get; set; }
    public string method_title { get; set; }
    public string method_id { get; set; }
    public string total { get; set; }
    public string total_tax { get; set; }
    public List<object> taxes { get; set; }
}

public class RootObject
{
    public int id { get; set; }
    public int parent_id { get; set; }
    public string status { get; set; }
    public string order_key { get; set; }
    public int number { get; set; }
    public string currency { get; set; }
    public string version { get; set; }
    public bool prices_include_tax { get; set; }
    public string date_created { get; set; }
    public string date_modified { get; set; }
    public int customer_id { get; set; }
    public string discount_total { get; set; }
    public string discount_tax { get; set; }
    public string shipping_total { get; set; }
    public string shipping_tax { get; set; }
    public string cart_tax { get; set; }
    public string total { get; set; }
    public string total_tax { get; set; }
    public Billing billing { get; set; }
    public Shipping shipping { get; set; }
    public string payment_method { get; set; }
    public string payment_method_title { get; set; }
    public string transaction_id { get; set; }
    public string customer_ip_address { get; set; }
    public string customer_user_agent { get; set; }
    public string created_via { get; set; }
    public string customer_note { get; set; }
    public string date_completed { get; set; }
    public string date_paid { get; set; }
    public string cart_hash { get; set; }
    public List<LineItem> line_items { get; set; }
    public List<object> tax_lines { get; set; }
    public List<ShippingLine> shipping_lines { get; set; }
    public List<object> fee_lines { get; set; }
    public List<object> coupon_lines { get; set; }
    public List<object> refunds { get; set; }
}