Я сериализую класс в приложении-функции azure и собираю его через ответ на публикацию в Unity3d. Это проект WebGL, и он отлично работает в редакторе, но создает исключение в браузере (chrome / firefox):
using Newtonsoft.Json;
namespace ARTFunctions
{
public class LoginResponse
{
public string status { get; set; }
public string token { get; set; }
public string clientDB { get; set; }
public string clientTable { get; set; }
[JsonConstructor]
public LoginResponse() { }
}
public async Task<System.String> MyFunctionApp([HttpTrigger(AuthorizationLevel.Anonymous, "get", "post", "head", Route = null)] HttpRequest req, ILogger log)
{
LoginResponse logResp = new LoginResponse();
logResp.status = "Success";
logResp.clientDB = "userDB";
logResp.clientTable = "thisTable";
logResp.token="abc";
return JsonConvert.SerializeObject(logResp);
}
В Unity3d я собираю сериализованный объект, но получаю ошибку конструктора:
using Newtonsoft.Json;
public class C_UnityClass: MonoBehaviour
{
public void AtButtonPressed()
{
UnityWebRequest www = UnityWebRequest.Post("https://xxx.azurewebsites.net/api/MyFunctionApp", formData);
yield return www.SendWebRequest();
string queryResult = www.downloadHandler.text;
var logResp = JsonConvert.DeserializeObject<LoginResponse>(queryResult);
debug.log("logResp"+logResp.token);
}
}
И создайте не моно класс LoginResponse с помощью JsonContructor:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
[System.Serializable]
public class LoginResponse
{
public string status { get; set; }
public string token { get; set; }
public string clientDB { get; set; }
public string clientTable { get; set; }
[JsonConstructor]
public LoginResponse (){}
//I also tried adding [JsonConstructor] to this constructor but throws error too
public LoginResponse(string status, string token, string clientDB, string clientTable)
{
this.status = status;
this.token = token;
this.clientDB = clientDB;
this.clientTable = clientTable;
}
}
Ошибка: JsonSerializationException: невозможно найти конструктор для использования для типа LoginResponse. Класс должен иметь конструктор по умолчанию, один конструктор с аргументами или конструктор, помеченный атрибутом JsonConstructor. Путь 'status', строка 1, позиция 10. в Newtonsoft. Json .Serialization.JsonSerializerInternalReader.CreateNewObject (Newtonsoft. Json .JsonReader reader, Newtonsoft. Json .Serialization.JsonObjectContract objectContract, Newtonsoft. Json. Serialization.JsonProperty containerMember, Newtonsoft. Json .Serialization.JsonProperty containerProperty, System.String id, System.Boolean & creationFromNonDefaultCreator) [0x00000] в <00000000000000000000000000000000>: 0
для использования в качестве единственного оператора ИД для LoginResponse, помеченного как [JsonConstructor], я получаю исключение, как если бы конструктор завершился ошибкой в azure приложении функции. Стоит отметить, что все это работает при запуске из редактора Unity, не работает в браузере (проверено на chrome / firefox):
"Unexpected end of Stream, the content may have already been read by another component. ","token":null,"clientDB":null,"clientTable":null}"
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
[System.Serializable]
public class LoginResponse
{
public string status { get; set; }
public string token { get; set; }
public string clientDB { get; set; }
public string clientTable { get; set; }
[JsonConstructor]
public LoginResponse (){}
}