C# xamarin listview的Json对象
我不熟悉xamarin和json,但我已经到了一个地步,我从我的php服务器得到了一个带有以下json代码的internet浏览器的响应,我知道这是一个对象数组,我使用visual studio选项中的选项为对象创建了一个类(编辑->过去特殊->过去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
{
"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,但现在正忙着寻找它