Problem z deserializacją JSON z polskimi znakami

0

Witam

Mam pytanie do bardziej doświadczonych. Próbuję zdeserializować JSON przychodzącego z API. Niestety zmienna elementList jest pusta mimo, że response z API zwraca dane. Dopóki w bazie nie było danych z polskimi znakami wszystko działało, po ich wprowadzeniu deserializacja nie udaje się. Domyślam się że chodzi o ustawienie kodowania na utf-8. Jak można to zrobić?

public class RestServiceElements : IRestServiceElements
    {
        private HttpClient client;
        private JsonSerializerOptions serializerOptions;
        public ElementsList elementsList { get; private set; }

        public RestServiceElements()
        {
            client = new HttpClient();
            serializerOptions = new JsonSerializerOptions
            {
                Encoder = JavaScriptEncoder.UnsafeRelaxedJsonEscaping,
                
                PropertyNamingPolicy = JsonNamingPolicy.CamelCase,
                WriteIndented = true
            };
        }

        public async Task<ElementsList> RefreshDataAsync()
        {
             elementsList = new ElementsList();
             Uri uri = new Uri(string.Format(Constants.ElementsRestUrl, string.Empty));
             try
             {
                 HttpResponseMessage response = await client.GetAsync(uri);
               
                if (response.IsSuccessStatusCode)
                 {
                    string content = await response.Content.ReadAsStringAsync();
                    elementsList = JsonSerializer.Deserialize<ElementsList>(content, serializerOptions);
                 }
             }
             catch (Exception ex)
             {
                 Debug.WriteLine(@"\tERROR {0}", ex.Message);
             }
            
            return elementsList;
        }
    }
0

@Ktos: Jasne

{"elements":[{"idElement":1,"name_Element":"Jezdnia"},{"idElement":2,"name_Element":"Chodnik"},{"idElement":3,"name_Element":"Sciezka rowerowa"},{"idElement":4,"name_Element":"Oznakowanie pionowe"},{"idElement":5,"name_Element":"Oznakowanie poziome"},{"idElement":6,"name_Element":"Wpust deszczowy"},{"idElement":7,"name_Element":"Studnia"},{"idElement":8,"name_Element":"Pobocze"},{"idElement":9,"name_Element":"Sygnalizacja swietlna"},{"idElement":10,"name_Element":"Bariera"},{"idElement":11,"name_Element":"Prog zwalniajacy"}],"errorMessage":null}
0

Pokaż też klasę ElementsList, do której chcesz zdeserializować JSON

0

@Piotr.Net: To jest klasa z Properties List, która składa się z ElementEntity:

  public class ElementsList
    {
        public List<ElementEntity> elementsList { get; set; }
    }

I ElementEntity

 public class ElementEntity
    {
        public int idElement { get; set; }
        public string Name_Element { get; set; }

        public ElementEntity()
        {
            
        }

        public ElementEntity(string name_element)
        {
            Name_Element = name_element;
        }
    }
2

W twoim JSON-ie pole w głównym elemencie nazywa się "elements", a w klasie ElementsList nazywa się "elementsList".

0

Zamiast tworzyć wrapper JSON, użyj do tego jakiegoś generatora, np.: https://app.quicktype.io/?l=csharp. Wklejając tam JSON, otrzymasz takie klasy (oczywiście nazwę głównej klasy - w tym przypadku X - nazwij sobie jak chcesz):

public partial class X
{
    [JsonProperty("elements")]
    public Element[] Elements { get; set; }

    [JsonProperty("errorMessage")]
    public object ErrorMessage { get; set; }
}

public partial class Element
{
    [JsonProperty("idElement")]
    public long IdElement { get; set; }

    [JsonProperty("name_Element")]
    public string NameElement { get; set; }
}

Do deserializacji użyj Newtonsoft.Json. W rezultacie cały kod aplikacji będzie wyglądał tak:

using Newtonsoft.Json;

namespace ConsoleApp
{
    class Program
    {
        static void Main(string[] args)
        {
            var json = "{\"elements\":[{\"idElement\":1,\"name_Element\":\"Jezdnia\"},{\"idElement\":2,\"name_Element\":\"Chodnik\"},{\"idElement\":3,\"name_Element\":\"Sciezka rowerowa\"},{\"idElement\":4,\"name_Element\":\"Oznakowanie pionowe\"},{\"idElement\":5,\"name_Element\":\"Oznakowanie poziome\"},{\"idElement\":6,\"name_Element\":\"Wpust deszczowy\"},{\"idElement\":7,\"name_Element\":\"Studnia\"},{\"idElement\":8,\"name_Element\":\"Pobocze\"},{\"idElement\":9,\"name_Element\":\"Sygnalizacja swietlna\"},{\"idElement\":10,\"name_Element\":\"Bariera\"},{\"idElement\":11,\"name_Element\":\"Prog zwalniajacy\"}],\"errorMessage\":null}";

            var jsonParsed = JsonConvert.DeserializeObject<X>(json);
        }
    }

    public partial class X
    {
        [JsonProperty("elements")]
        public Element[] Elements { get; set; }

        [JsonProperty("errorMessage")]
        public object ErrorMessage { get; set; }
    }

    public partial class Element
    {
        [JsonProperty("idElement")]
        public long IdElement { get; set; }

        [JsonProperty("name_Element")]
        public string NameElement { get; set; }
    }
}

1 użytkowników online, w tym zalogowanych: 0, gości: 1