Xamarin c # не может позвонить в Google Gson FromJson - PullRequest
0 голосов
/ 03 июня 2019

Я пытаюсь вызвать метод "fromJSon" из Google Gson (в C #, Xamarin), но я получаю следующее сообщение об ошибке: "Аргумент 2, невозможно преобразовать Java.Lang.Object в Java.Lang.Class".

Вот мой исходный код соответствующей части:

...
        HomePojo mHomePojo = null;
        Gson mGson = new Gson();

        try
        {
            GoogleGson.JsonObject dataObject = jObject.GetAsJsonObject(AppGlobal.TAG_JSON_DATA_OBJECT);
            Java.Lang.Object clazz = Java.Lang.Class.FromType(typeof(HomePojo));
            mHomePojo = mGson.FromJson(dataObject.AsJsonObject, clazz);

        }
        catch (JSONException e)
        {
            Console.WriteLine(e.ToString());
            Console.Write(e.StackTrace);
        }
        return mHomePojo;
...

Показывает «Аргумент 2, невозможно преобразовать Java.Lang.Object в Java.Lang.Class».

Ответы [ 2 ]

1 голос
/ 03 июня 2019

Вам необходимо объявить вашу переменную как Java.Lang.Class, чтобы она соответствовала типу параметра.

0 голосов
/ 04 июня 2019

Вам необходимо создать ObjectTypeHelper класс.

public static class ObjectTypeHelper
    {
      public static T Cast<T>(this Java.Lang.Object obj) where T : class
        {
            var propertyInfo = obj.GetType().GetProperty("Instance");
            return propertyInfo == null ? null : propertyInfo.GetValue(obj, null) as T;
        }
    }

И HomePojo Класс должен наследоваться от ObjectTypeHelper , затем попытаться выполнить следующий код:

GoogleGson.JsonObject dataObject = jObject.GetAsJsonObject(AppGlobal.TAG_JSON_DATA_OBJECT);
mHomePojo = mGson.FromJson(dataObject.AsJsonObject, Java.Lang.Class.FromType(typeof(HomePojo)).Cast<HomePojo>();;

Если не работает, возможно, Gson все еще совместим с xamarin android.

WorkaRound :

Почему бы не использовать Newtonsoft.Json для десериализации вашего json.

public class RootObject
{
    public int id { get; set; }
    public string name { get; set; }
    public Type type { get; set; }
    public List<string> options { get; set; }
}

Тогда вы сможете десериализовать свой JSON:

List<RootObject> myData = JsonConvert.DeserializeObject<List<RootObject>>(json);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...