错误ArgumentException:JSON必须表示来自PyZeroMQ服务器的对象类型

问题描述

尝试解析从我的Python服务器返回的Json对象时遇到问题。 我得到的错误是 “ ArgumentException:JSON必须表示对象类型。”

令人困惑的是,如果我从服务器返回的确切字符串并对其进行硬编码,然后再将其传递给解析方法Player.CreateFromJSON,则它会起作用!

这是Python服务器中的3条相关行

 x = '{"playerId":8484239823,"playerLoc":"Powai","playerNick":"Random Nick"}'
 y = json.dumps(x)
 socket.send_string(y)

这是返回的JSON字符串。

"{\"playerId\":8484239823,\"playerLoc\":\"Powai\",\"playerNick\":\"Random Nick\"}"

这是我的Player对象

[System.Serializable]
public class Player
{
    public string playerId;
    public string playerLoc;
    public string playerNick;

    public static Player CreateFromJSON(string jsonString)
    {
        return JsonUtility.FromJson<Player>(jsonString);
    }
}

从上方可以看出,我使用的是Unity原生的JsonUtility FromJson方法,我只需调用

Player playerInfo = Player.CreateFromJSON(jsonStringFromServer);

填充Player对象

花费了无数个小时来进行谷歌搜索,并试图找到类似的问题。欢迎任何反馈或故障排除步骤!

解决方法

问题出在您的Python代码中;即x已经是一个JSON字符串;您不需要致电json.dumps(x),可以直接使用socket.send_string(x)发送。

实际上,y = json.dumps(x)返回一个JSON编码的JSON字符串!

'"{\\"playerId\\":8484239823,\\"playerLoc\\":\\"Powai\\",\\"playerNick\\":\\"Random Nick\\"}"'

不能解码为Player对象-因为它是string!在您的Python代码中删除该行,然后直接直接socket.send_string(x)