我已经创建了一个HTTP客户端,它向我的服务器发送数据。这些数据将查询我的服务器,它将返回一个JSON对象。如何从服务器接收JSON对象响应并将其插入数据库?
下面的代码将向我的服务器发送一个ContactID,我的服务器将返回一个JSON对象,如何从我的服务器获得JSON对象?我将在我的代码中添加什么?我增加了
var data = await response.Content.ReadAsStringAsync();
但我不知道该怎么做。
try
{
var db = DependencyService.Get<ISQLiteDB>();
var conn = db.GetConnection();
var sql = "SELECT * FROM tblUser WHERE ContactID = '" + contact + "'";
var getUser = conn.QueryAsync<UserTable>(sql);
var resultCount = getUser.Result.Count;
//Check if the user has been sync
if (resultCount < 1)
{
try
{
syncStatus.Text = "Syncing user to server...";
var link = Constants.requestUrl + "Host=" + host + "&Database=" + database + "&Contact=" + contact + "&Request=8qApc8";
string contentType = "application/json";
JObject json = new JObject
{
{ "ContactID", contact }
};
HttpClient client = new HttpClient();
var response = await client.PostAsync(link, new StringContent(json.ToString(), Encoding.UTF8, contentType));
var data = await response.Content.ReadAsStringAsync();
if (response.IsSuccessStatusCode)
{
var content = await response.Content.ReadAsStringAsync();
var userresult = JsonConvert.DeserializeObject<IList<UserData>>(content);
var count = userresult.Count;
for (int i = 0; i < count; i++)
{
try
{
syncStatus.Text = "Syncing user to server...";
var item = userresult[i];
var contactID = item.ContactID;
var userID = item.UserID;
var userPassword = item.UserPassword;
var userType = item.UserType;
var userStatus = item.UserStatus;
var lastSync = item.LastSync;
var serverUpdate = item.ServerUpdate;
var mobileUpdate = item.MobileUpdate;
var user = new UserTable
{
ContactID = Convert.ToInt32(contactID),
UserID = userID,
UserPassword = userPassword,
UserType = userType,
UserStatus = userStatus,
LastSync = lastSync,
ServerUpdate = serverUpdate,
MobileUpdate = mobileUpdate
};
await conn.InsertAsync(user);
}
catch (Exception ex)
{
Console.Write("Syncing user error " + ex.Message);
}
}
}
}
catch (Exception ex)
{
Console.Write("Syncing User Error " + ex.Message);
}
}
我的PHP代码将使用从Xamarin客户端收到的ContactID查询数据库。
$json_str = file_get_contents('php://input');
$json_obj = json_decode($json_str);
$ContactID = $json_obj->ContactID;
$sql = "SELECT * FROM tblUser WHERE ContactID = '$ContactID'";
$result = mysqli_query($conn, $sql);
$count = mysqli_num_rows($result);
if($count > 0){
while ($row = @mysqli_fetch_array($result)) {
$decr = CryptRC4(FromHexDump($row['UserPassword']), $key);
$ar[] = array(
'ContactID' => $row['ContactID'],
'UserID' => $row['UserID'],
'UserPassword' => $decr,
'UserType' => $row['UserType'],
'UserStatus' => $row['UserStatus'],
'LastSync' => $sync,
'ServerUpdate' => $row['ServerUpdate'],
'MobileUpdate' => $row['MobileUpdate']
);
print json_encode($ar);
//Update LastSync DateTime
$sql = "UPDATE tblUser SET LastSync = '$sync' WHERE ContactID = '$ContactID'";
mysqli_query($conn, $sql);
}
}
发布于 2018-09-16 20:11:20
以上示例中的最后一条语句以字符串格式给出了json对象的列表。
var data = await response.Content.ReadAsStringAsync();
您需要将其转换回对象列表。要让项目了解对象的定义,可以使用公共属性创建一个普通类(如下所示)
public class UserLog
{
public int ContactId { get; set; }
public string Log { get; set; }
public DateTime LogDate { get; set; }
}
将Newtonsoft.Json (由编写) Nuget包添加到您的项目中,以便您可以使用json。
若要将变量“数据”的内容转换为UserLog对象列表,请编写如下代码
var list = NewtonsoftUtil<IList<UserLog>>.DeserializeObject(data);
(在文件顶部添加using Newtonsoft.Json;
)
如果这有帮助,请告诉我。
发布于 2018-09-16 23:29:03
上面的答案遗漏了一个重要的问题-> efficiency
。
不需要在内存中分配字符串,特别是如果JSON很大的话。Streams
可以比string
做得更好:
// Read the response as stream
var stream = await response.Content.ReadAsStreamAsync();
// Use the next method for deserialization
T DeserializeJsonFromStream<T>(Stream stream)
{
if (stream == null || stream.CanRead == false)
return default(T);
using (var sr = new StreamReader(stream))
using (var jtr = new JsonTextReader(sr))
{
var js = new JsonSerializer();
return js.Deserialize<T>(jtr);
}
}
P.S.:代码示例基于Json.NET。
有很多关于这个主题的好文章,我可以推荐你熟悉下一个一。
发布于 2018-09-16 20:23:35
假设你一切都做对了。换句话说,您可以发送您的contactID并返回一个json。
假设您的json结构类似于:{"firstname" : "Doe", "lastname" : "foo" "age" : "27"}
检索数据的一种可能方法如下:
using Newtonsoft.Json;
//after PostAsync()
if (response.IsSuccessStatusCode)
{
var content = await response.Content.ReadAsStringAsync();
JObject jContent = (JObject)JsonConvert.DeserializeObject(content);
string firstName = (string)jContent.GetValue("firstname")
string lastName = (string)jContent.GetValue("lastname");
int age = (int)jContent.GetValue("age");
}
Newtonsoft可在Nuget上使用。你需要安装它,如果你还没有这样做。
改进解
如果您的json有许多键/值对,如下所示:
{ key1 : value1, key2 : value2, key3 : value3, ... key10 : value10}
那么,这样做并不是一个好主意:
string foo1 = (string)jContent.GetValue("key1");
string foo2 = (string)jContent.GetValue("key2");
//...
string foo10 = (string)jContent.GetValue("key10");
要处理这种情况,可以创建一个类:
public class Foo
{
public string Foo1 {get;set;}
public string Foo2 {get;set;}
//...
public string Foo2 {get;set;}
}
然后,您可以做以下简单的工作:
if (response.IsSuccessStatusCode)
{
var content = await response.Content.ReadAsStringAsync();
Foo foo = JsonConvert.DeserializeObject<Foo>(content);
}
改进后的解决方案参考自www.newtonsoft.com。去那里看看其他使用图书馆的方法。
https://stackoverflow.com/questions/52360256
复制相似问题