首页 > 解决方案 > 如何修复 JSONUtility 中的“ArgumentException:JSON 必须表示对象类型”

问题描述

我正在使用 PHP 和 Unity 制作一个简单的游戏,当我使用 php 请求日期时,我会回调此错误“ArgumentException:JSON 必须表示对象类型”。

json:

[{"id":"1","user_id":"1","nome":"Conde","level":"1","hp":"100","mana":"100","stamina":"100","dano":"35","vel_atq":"35","defesa":"35","bloqueio":"35","critico":"35","dano_critico":"35"}]

C# 统一

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
using UnityEngine.Networking;
using System;


public class PlayerS2 : MonoBehaviour
{
    public string url = "http://localhost/";
    [Serializable]
    public class MyPlayer
    {
        public int user_id;
        public string nome;
        public int level;
        public int hp;
        public int mana;
        public int stamina;
        public int dano;
        public float vel_atq;
        public int defesa;
        public int bloqueio;
        public int critico;
        public int dano_critico;
    }
    public IEnumerator GetDadosPlayer(string userID)
    {
        MyPlayer dadosPlayer = new MyPlayer();
        WWWForm form = new WWWForm();
        form.AddField("userID", userID);

        using (UnityWebRequest www = UnityWebRequest.Post(url + "GetDadosPlayer.php", form))
        {
            yield return www.SendWebRequest();


            if (www.isNetworkError || www.isHttpError)
            {
                Debug.Log(www.error);
            }
            else
            {
                Debug.Log(www.downloadHandler.text);
                string json = www.downloadHandler.text;
                dadosPlayer = JsonUtility.FromJson<MyPlayer>(json);
                Debug.Log(dadosPlayer.nome);

            }
        }
    }
    void Start(){
        StartCoroutine(GetDadosPlayer("1"));
    }
}

PHP

<?php
require_once("ConexaoBD.php");
$userID = isset($_POST['userID']) ? $_POST['userID'] : "1";

$query = '
SELECT
    *
FROM
    player 
WHERE
    user_id = :user_id  
';
$stmt = $conn->prepare($query);
$stmt->bindValue(':user_id',$userID);
$stmt->execute();/*
$result = $stmt->fetchAll(PDO::FETCH_OBJ);
    if(!empty($result)){
        echo "";
    }else{
        echo $result[0]->$id;
    }
*/
$results;
while($result = $stmt->fetchAll(PDO::FETCH_OBJ)){


    $results = $result;
}
echo json_encode($results);
?>

标签: c#jsonunity3d

解决方案


您正在尝试将单对象数组转换为对象。

JSON 周围的方括号代表一个数组。大括号代表您的对象。这一行:

dadosPlayer = JsonUtility.FromJson<MyPlayer>(json);

...尝试获取您的 JSON 并将其转换为 MyPlayer 对象,但您的 JSON 不代表一个对象,它代表一个对象数组。

使用“fetchAll”将对象从数据库中拉出的代码旨在返回多个对象并将它们放入数组中。由于您的代码应该只从数据库返回一个对象,而不是 fetchAll,因此请尝试找到一个只从数据库返回一个对象的函数。

它应该返回的对象应该如下所示:

{"id":"1","user_id":"1","nome":"Conde","level":"1","hp":"100","mana":"100","stamina":"100","dano":"35","vel_atq":"35","defesa":"35","bloqueio":"35","critico":"35","dano_critico":"35"}

不是这样的:

[{"id":"1","user_id":"1","nome":"Conde","level":"1","hp":"100","mana":"100","stamina":"100","dano":"35","vel_atq":"35","defesa":"35","bloqueio":"35","critico":"35","dano_critico":"35"}]

推荐阅读