C# xamarin listview的Json对象

C# xamarin listview的Json对象,c#,json,xamarin.android,C#,Json,Xamarin.android,我不熟悉xamarin和json,但我已经到了一个地步,我从我的php服务器得到了一个带有以下json代码的internet浏览器的响应,我知道这是一个对象数组,我使用visual studio选项中的选项为对象创建了一个类(编辑->过去特殊->过去json作为类)我只知道如何登录系统,但我想做的是查看列表视图上的数据。对不起,我的英语不好 { "error": false, "users": [ { "idCustomer": 38, "firstnam

我不熟悉xamarin和json,但我已经到了一个地步,我从我的php服务器得到了一个带有以下json代码的internet浏览器的响应,我知道这是一个对象数组,我使用visual studio选项中的选项为对象创建了一个类(编辑->过去特殊->过去json作为类)我只知道如何登录系统,但我想做的是查看列表视图上的数据。对不起,我的英语不好

{
  "error": false,
  "users": [
    {
      "idCustomer": 38,
      "firstname": "Dxxxx",
      "surname": "Cxxxxx",
      "gamertag": "Mxxxx",
      "email": "dpxxxxx@xxxxxl.com",
      "mobile": "012xxxxxx"
    },
    {
      "idCustomer": 36,
      "firstname": "Pxxxxx",
      "surname": "Axxxxxx",
      "gamertag": "Mxxxxxxx",
      "email": "pxxxxxx@xxxxxxx.com",
      "mobile": "0728468780"
    },
    {
      "idCustomer": 37,
      "firstname": "Dxxxxxx",
      "surname": "Dxxxxxx",
      "gamertag": "Axxxxxxxx",
      "email": "txxxxxxx@xxxxxl.com",
      "mobile": "011xxxxxxx"
    },
    {
      "idCustomer": 39,
      "firstname": "Exxxxxx",
      "surname": "Axxxxxxx",
      "gamertag": "Cxxxxxxx",
      "email": "exxxxxx@xxxxxxxx.com",
      "mobile": "012xxxxxxx"
    },
    {
      "idCustomer": 40,
      "firstname": "Cxxxxxx",
      "surname": "Axxxxxxx",
      "gamertag": "Bxxxxxxx",
      "email": "cxxxxxxx.xxxxxxx@xxxxxxx.com",
      "mobile": "012"
    },
    {
      "idCustomer": 41,
      "firstname": "Lenard",
      "surname": "Neemoid",
      "gamertag": "Gamers",
      "email": "email@email.com",
      "mobile": "10214785"
    },
    {
      "idCustomer": 42,
      "firstname": "Lenard",
      "surname": "Nemoi",
      "gamertag": "Spack",
      "email": "email@email.com",
      "mobile": "123456789"
    },
    {
      "idCustomer": 43,
      "firstname": "test",
      "surname": "test",
      "gamertag": "test",
      "email": "test@test.com",
      "mobile": "123456789"
    },
    {
      "idCustomer": 44,
      "firstname": "test",
      "surname": "tees",
      "gamertag": "tes",
      "email": "ttess",
      "mobile": "11222456"
    },
    {
      "idCustomer": 51,
      "firstname": "Dxxxxxxx",
      "surname": "Lxxxxxxx",
      "gamertag": "Sxxxxxxx",
      "email": "Dxxxxxxx.Lxxxxxxx@Sxxxxxxx.com",
      "mobile": "1234567890"
    }
  ]
}
我已经使用了这个代码,但我确实得到了一个错误

namespace LANApp
{
[Activity(Label = "@string/app_name", Theme = "@style/AppTheme", MainLauncher = true)]
public class MainActivity : AppCompatActivity
{
    private ListView list_user;
    private Button bnt_get_data;

    private ArrayAdapter<string> adapter;
    private SynchronizationContext sc;
    protected override void OnCreate(Bundle bundle)
    {
        base.OnCreate(bundle);
        SetContentView(Resource.Layout.Main);

        list_user = FindViewById<ListView>(Resource.Id.list_user);
        bnt_get_data = FindViewById<Button>(Resource.Id.bnt_get_data);

        adapter = new ArrayAdapter<string>(this, Android.Resource.Layout.SimpleDropDownItem1Line);
        adapter.Add("No Data Yet");
        list_user.Adapter = adapter;

        sc = SynchronizationContext.Current;
        bnt_get_data.Click += Bnt_get_data_Click;
    }

    private void Bnt_get_data_Click(object sender, EventArgs e)
    {
        getJSON();
    }


    private async void getJSON()
    {
        adapter.Clear();

        IRestClient client = new RestClient("http://192.xxx.xxx.xxx/Laxxxxxx/public");
        IRestRequest request = new RestRequest("allusers/", Method.GET);

        try
        {
            await Task.Run(() => 
            {
                IRestResponse<List<User>> response = client.Execute<List<User>>(request);
                foreach(var user in response.Data)
                {
                    sc.Post(new SendOrPostCallback(o =>
                    {
                        adapter.Add(o as string);
                        adapter.NotifyDataSetChanged();
                    }), user.gamertag);
                }
            });
        }
        catch(Exception e)
        {
            Console.WriteLine(e.Message);
        }
        return;
    }
}
}
namespace-LANApp
{
[活动(Label=“@string/app_name”,Theme=“@style/AppTheme”,MainLauncher=true)]
公共类MainActivity:AppCompativeActivity
{
私有列表视图列表用户;
私人按钮bnt_获取数据;
专用阵列适配器;
私有同步上下文sc;
创建时受保护的覆盖无效(捆绑包)
{
base.OnCreate(bundle);
SetContentView(Resource.Layout.Main);
list\u user=findviewbyd(Resource.Id.list\u user);
bnt_get_data=findviewbyd(Resource.Id.bnt_get_data);
adapter=new ArrayAdapter(这是Android.Resource.Layout.SimpleDropDownItem1Line);
adapter.Add(“还没有数据”);
list_user.Adapter=适配器;
sc=SynchronizationContext.Current;
bnt_获取数据。单击+=bnt_获取数据\u单击;
}
私有void Bnt_获取数据_单击(对象发送方,事件参数e)
{
getJSON();
}
私有异步void getJSON()
{
适配器。清除();
IRestClient=新的RestClient(“http://192.xxx.xxx.xxx/Laxxxxxx/public");
IRestRequest请求=新的重新请求(“allusers/”,Method.GET);
尝试
{
等待任务。运行(()=>
{
IRestResponse response=client.Execute(请求);
foreach(响应中的var user.Data)
{
sc.Post(新的SendOrPostCallback(o=>
{
adapter.Add(o作为字符串);
adapter.NotifyDataSetChanged();
}),user.gamertag);
}
});
}
捕获(例外e)
{
控制台写入线(e.Message);
}
返回;
}
}
}
并且错误是未处理的异常:

Java.Lang.NullPointerException:尝试在空对象引用上调用虚拟方法“Java.Lang.String Java.Lang.Object.toString()”

我的用户类如下所示

namespace LANApp.Model
{
public class User
{
    public int idCustomer { get; set; }
    public string firstname { get; set; }
    public string surname { get; set; }
    public string gamertag { get; set; }
    public string email { get; set; }
    public string mobile { get; set; }
}

public class RootObject
{
    public bool error { get; set; }
    public List<User> users { get; set; }
}
}
namespace-LANApp.Model
{
公共类用户
{
public int idCustomer{get;set;}
公共字符串名{get;set;}
公共字符串姓氏{get;set;}
公共字符串gamertag{get;set;}
公共字符串电子邮件{get;set;}
公共字符串mobile{get;set;}
}
公共类根对象
{
公共布尔错误{get;set;}
公共列表用户{get;set;}
}
}

首先定义一个复杂对象,您可以将JSON反序列化为该对象,它应该如下所示:

public class User
{
    public int idCustomer { get; set; }

    public string firstname { get; set; }

    public string surname { get; set; }

    public string gamertag { get; set; }

    public string email { get; set; }

    public string mobile { get; set; }
}
using newtonsoft.json

JsonConvert.DeserializeObject<List<User>>(jsonString);
如今,从JSON创建对象非常容易。借助Visual Studio,您可以创建一个新类并复制JSON字符串,然后使用:

编辑->粘贴特殊->将Json粘贴为类

这将从JSON字符串创建一个复杂对象,就像上面的简单字符串一样

完成后,您可以将JSON传递到反序列化器,如下所示:

public class User
{
    public int idCustomer { get; set; }

    public string firstname { get; set; }

    public string surname { get; set; }

    public string gamertag { get; set; }

    public string email { get; set; }

    public string mobile { get; set; }
}
using newtonsoft.json

JsonConvert.DeserializeObject<List<User>>(jsonString);
使用newtonsoft.json
反序列化对象(jsonString);
进一步阅读:


是的,您可以使用
Newtonsoft.Json
Nuget来实现这一点,根据您的错误,您可以尝试初始化
公共列表用户
,如下所示

RootObject

public class RootObject
{
    public bool error { get; set; }

    public List<User> users = new List<User>();  // init the users like this 
}
公共类根对象
{
公共布尔错误{get;set;}
public List users=new List();//初始化如下用户
}
如果问题仍然存在,您可以尝试检查ArrayAdapter中的数组是否包含空项。那里不能有空值。 您可以先从以下代码中进行检查:

IRestResponse<List<User>> response = client.Execute<List<User>>(request);
            foreach(var user in response.Data)
            {
                sc.Post(new SendOrPostCallback(o =>
                {
                    adapter.Add(o as string);
                    adapter.NotifyDataSetChanged();
                }), user.gamertag);
            }
IRestResponse response=client.Execute(请求);
foreach(响应中的var user.Data)
{
sc.Post(新的SendOrPostCallback(o=>
{
adapter.Add(o作为字符串);
adapter.NotifyDataSetChanged();
}),user.gamertag);
}

注意:首先检查
响应的值

,您需要提供与问题相关的代码。我认为您需要花一些时间阅读有关序列化和反序列化Json的内容,以便更好地理解它。现在这个问题是要求人们为你做你的工作抱歉,我会编辑我的帖子谢谢你的回复,错误发生在适配器上。add(o as string)@AHandyCap你有解决方案吗?我开始认为可能是我设置的php,但现在正忙着寻找它