Как десериализовать Geopoint с помощью деселератора JSON newtonsoft? - PullRequest
1 голос
/ 10 октября 2019

Я храню данные о положении клиентов, используя следующий класс:

  public class CustomerData
{
    public string CustomerName { get; set; }
    public int CustomerNumber { get; set; }
    public string CustomerAddress { get; set; }
    public string CustomerCity { get; set; }
    public string CustomerZip { get; set; }
    public string CustomerState { get; set; }
    public Geopoint CustomerGeopoint { get; set; }

}

внутри файла JSON ... и извлекаю данные с помощью службы, например:

public static async Task<ObservableCollection<CustomerData>> GetCustomerData()
    {
        var folder = ApplicationData.Current.LocalFolder;
        var dataFile = await folder.TryGetItemAsync("CustomerData.json") as IStorageFile;
        var stringResult = await FileIO.ReadTextAsync(dataFile);

        ObservableCollection<CustomerData> CustomersRetrievedData = JsonConvert.DeserializeObject<ObservableCollection<CustomerData>>(stringResult, new JsonSerializerSettings
        {
            TypeNameHandling = TypeNameHandling.All
        });
        Customers = CustomersRetrievedData;
        return await Task.FromResult(CustomersRetrievedData);
    }

а также сохраняя данные следующим образом:

       public static async void SaveCustomerData()
    {
        var folder = ApplicationData.Current.LocalFolder;
        StorageFile newFile = await folder.CreateFileAsync("CustomerData.json", CreationCollisionOption.ReplaceExisting);
        var stringData = JsonConvert.SerializeObject(Customers);
        await FileIO.WriteTextAsync(newFile, stringData);

    }

Моя проблема в том, что после того, как все данные геоприсоединения находятся там, когда я пытаюсь прочитать данные, десериализовав их в методе GetCustomerData (), я получаюследующая ошибка:

Невозможно найти конструктор для использования для типа Windows.Devices.Geolocation.Geopoint. Класс должен иметь конструктор по умолчанию, один конструктор с аргументами или конструктор, помеченный атрибутом JsonConstructor

Я не понимаю, как это исправить, и я не могу найти что-либо на newtonsoftдокументация, кто-нибудь знает, как это делается?

1 Ответ

0 голосов
/ 10 октября 2019

Глядя на документацию по Geopoint, мы видим, что у него есть 3 .ctors, ни один из которых не имеет параметров. Для десериализации JSON.NET требуется .ctor без параметров, как вы можете видеть из полученного сообщения об ошибке.

Итак, одну вещь, которую вы можете сделать, это изменить свой класс, включив в него свойство с типом (который вы создаете)которая отражает структуру Geopoint (включает в себя все ее свойства), но также включает .ctor без параметров. Вы даже можете реализовать IGeoshape, чтобы его можно было использовать везде, где требовалось IGeoshape.

Что-то вроде:

public class GeopointProxy : IGeoshape {
    public GeopointProxy() { }

    private AltitudeReferenceSystem _altitudeReferenceSystem;
    // This is part of the IGeoshape interface, you can't change it's signature, and it's readonly.  Fun.
    [JsonIgnore]
    public AltitudeReferenceSystem AltitudeReferenceSystem { get { return _altitudeReferenceSystem; } }  

    public AltitudeReferenceSystem SettableAltitudeReferenceSystem {
        get {
            return AltitudeReferenceSystem;
        }
        set {
            _altitudeReferenceSystem = value;
        }
    }

    // rinse and repeat as appropriate for the other interface members and class properties

    // Then include a conversion function, or get fancy and add type conversion operators:
    public Geopoint ToGeopoint() {
        return new Geopoint(Position, AltitudeReferenceSystem, SpatialReferenceId);
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...