Как представить JSON как тип объекта? (Unity3D, использующий RESTful веб-сервисы) - PullRequest
0 голосов
/ 08 ноября 2019

https://i.imgur.com/2t2gO0g.png

Ошибка: «JSON должен представлять тип объекта». Но только когда я добавляю "{\" meshDatas \ ":" + jsonResult + "}";это работает (извините за то, что действительно плохо объяснил)

Столкнулся с проблемой (https://i.imgur.com/XDzokfj.png), "JSON должен представлять тип объекта".

Как мне сделать, чтобы сделатьМои Rest Api возвращают список в виде объекта JSON?

Фактический ответ Json: https://i.imgur.com/GUzHKG8.png

Видео следующих тезисов: https://www.youtube.com/watch?v=TrOLTrIX9Yk && https://www.youtube.com/watch?v=00gSBOTI4tg, затем изменилкод для получения MeshData из базы данных

Попытка: string jsonResult = System.Text.Encoding.UTF8.GetString (www.downloadHandler.data);

var newJson = "{\" meshDatas \":" + jsonResult + "}";
MeshDataList meshDataList = JsonUtility.FromJson (newJson);

, которая работала и сузила проблему до форматирования Rest Api, но теперь я не знаю, как идтио том, чтобы заставить Api отправить правильное форматирование ...

Image_For.Context https://i.imgur.com/tWj8Ohf.png

//RestClient.cs (Unity)
using System;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.Networking;

public class RestClient : MonoBehaviour
{
    private static RestClient _instance;

    public static RestClient Instance 
    {
        get
        {
            if (_instance == null)
            {
                _instance = FindObjectOfType<RestClient>();
                if (_instance == null)
                {
                    GameObject go = new GameObject();
                    go.name = typeof(RestClient).Name;
                    _instance = go.AddComponent<RestClient>();
                    DontDestroyOnLoad(go);
                }
            }
            return _instance;
        }
    }

    public IEnumerator Get(string url, System.Action<MeshDataList> callBack)
    {
        using (UnityWebRequest www = UnityWebRequest.Get(url))
        {
            yield return www.SendWebRequest();
            if (www.isNetworkError)
            {
                Debug.Log(www.error);
            }
            else
            {
                if (www.isDone)
                {
                    try
                    {
                        string jsonResult = System.Text.Encoding.UTF8.GetString(www.downloadHandler.data);

                        var newJson = "{\"meshDatas\":" + jsonResult + "}";                        
                        MeshDataList meshDataList = JsonUtility.FromJson<MeshDataList>(newJson);

                        callBack(meshDataList);
                    }
                    catch(Exception e)
                    {
                        Debug.Log(e.Message);
                    }


                }
            }

        }
    }
//Game.cs (Unity)
public class Game : MonoBehaviour
{
    public string WEB_URL = "";

    // Start is called before the first frame update
    void Start()
    {
        StartCoroutine(RestClient.Instance.Get(WEB_URL, GetMeshDatas));        
    }

    void GetMeshDatas(MeshDataList meshDataList)
    {
        foreach (MeshData meshData in meshDataList.meshDatas)
        {

            Debug.Log("MeshData Xsize :" + meshData.xsize);
            Debug.Log("MeshData Zsize :" + meshData.zsize);
            Debug.Log("MeshData Width :" + meshData.width);
            Debug.Log("MeshData Height :" + meshData.height);
            Debug.Log("MeshData Scale :" + meshData.scale);
            Debug.Log("MeshData OffsetX :" + meshData.offsetX);
            Debug.Log("MeshData OffsetY :" + meshData.offsetY);
            Debug.Log("MeshData Id :" + meshData.id);

        }
    }

}

//UMM.API.Dummy.Controllers
[Route("api/[controller]")]
    [ApiController]
    public class MeshDatasController : Controller
    {
        private readonly UMMClientDEMContext _context;

        public MeshDatasController(UMMClientDEMContext context)
        {
            _context = context;
        }

        // GET: api/MeshDatas
        [HttpGet]
        public async Task<ActionResult<IEnumerable<MeshData>>> GetMeshData()
        {
            return await _context.MeshData.ToListAsync();
        }

        // GET: api/MeshDatas/{n}
        [HttpGet("{id}")]
        public async Task<ActionResult<MeshData>> GetMeshData(int id)
        {
            var meshData = await _context.MeshData.FindAsync(id);
            //MeshData meshData = MeshData.Single(mbox => mbox.Id == Id);

            if (meshData == null)
            {
                return NotFound();
            }

            return meshData;
        }
//UMM.API.Dummy.Models
namespace UMM.API.Dummy.Models
{
    [JsonObject, Serializable]
    public class MeshData
    {
        public int? Xsize { get; set; }
        public int? Zsize { get; set; }
        public int? Width { get; set; }
        public int? Height { get; set; }
        public int? Scale { get; set; }
        public int? OffsetX { get; set; }
        public int? OffsetY { get; set; }
        public int Id { get; set; }
    }

Ожидаемый результат https://i.imgur.com/E3lmFKW.png Получениеправильные отформатированные данные Json с обратной стороны Rest Api, например

{"meshDatas": [{"xsize": 20, "zsize": 20, "ширина": 256, "высота": 256, "масштаб": 20, "OffsetX": 100, "OffsetY": 100, "идентификатор": 1}]}

1 Ответ

0 голосов
/ 08 ноября 2019

Я думаю, вы хотите что-то вроде этого

// GET: api/MeshDatas
        [HttpGet]
        public async Task<ActionResult<MeshDataListObject>> GetMeshData() //Returnable type changed here
        {
            MeshDataListObject returnable = new MeshDataListObject();
            returnable.meshDatas = await _context.MeshData.ToListAsync();
            return returnable;
        }
public class MeshDataListObject {
    public IEnumerable<MeshData> meshDatas; //Something to hold the result you want to return. 
//This will be serialized to something like {"meshDatas":[]}
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...