c# - 如何修复 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);
?>
解决方案
您正在尝试将单对象数组转换为对象。
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"}]
推荐阅读
- css-selectors - 如何在 tailwindcss 中使用伪选择器 before::after?
- armeria - 使用 context.log().whenComplete() 对 Armeria 的装饰器进行单元测试
- reactjs - 根据版本显示 Cloudinary React Image
- vba - 将 Excel 工作簿中的所有图表导出到 windows 文件夹
- pine-script - 特定时间戳的 bar_index
- arrays - 如何在 OCaml 中实现 Array.to_list 和 Array.of_list
- next.js - 导入的动态组件卡在加载阶段:下一个 js
- batch-file - 在批处理脚本中查找字符串并分配一个变量
- flutter - Flutter:禁用下拉按钮选项
- swift - Swift URLSession 不适用于本地主机调用