【问题标题】:Unity JsonUtility doesn't properly convert string to an objectUnity JsonUtility 没有正确地将字符串转换为对象
【发布时间】:2021-08-03 16:45:45
【问题描述】:

我正在使用 JsonUtility 将 json 字符串反序列化为数据包。

if (client.ReceiveBufferSize > 0)
    {
        var ns = client.GetStream();

        Byte[] bytes = new byte[client.ReceiveBufferSize];
        ns.Read(bytes, 0, client.ReceiveBufferSize);
        string msg = Encoding.ASCII.GetString(bytes); //the message incoming
        var packet = JsonUtility.FromJson<Packet>(msg);
        return packet;
    }

收到时msg 是:{"Command":0, "Message":"Hello Client..."}

我正在尝试将其转换为如下所示的 Packet 类:

public class Packet
{
    public Command Command { get; set; }
    public object Message { get; set; }
}

但是,我转换后的数据包如下:

{
    "Command": "Message",
    "Message": null
}

有谁知道为什么会发生这种情况或是否有其他选择? (除了 NewtonSoft,因为它在 Unity 中存在问题)

【问题讨论】:

  • 为什么你需要对象而不是字符串?
  • 因为我通过整数、类和布尔值、状态等发送。
  • 在反序列化之前你知道它是否会是一个 int、class 等吗?
  • @DavidG 不,我没有,我确实想过使用泛型,但想不出办法让它发挥作用。问题是为什么 JsonUtility 不能像 Newtonsoft 这样的其他软件包可以反序列化它。我接受了另一个答案,因为它确实提供了一种解决方法。但如果你有另一个我会很乐意接受你的

标签: c# json unity3d


【解决方案1】:

我认为您的主要问题是使用错误的类型,

你基本上可以这样做:

public Packet returnAsJson(string jsonString)
    {
        return JsonUtility.FromJson<Packet>(jsonString);
    }
public class Packet
{
    public string Command;
    public string Message;
}

在您的情况下,这会将 Packet 作为带有 json 变量的对象返回


*如果你想使用对象而不是字符串首先确保你可以从字符串创建一个对象,如果这不起作用你可以创建一个新类

并创建函数以将字符串作为正确的类型放入类中

public class FinalPacket
{
    public command Command;
    public object Message;
}

public void FinalPacket(Packet pak)
{
//put the variables to the new class
}

【讨论】:

  • OP 需要使用object 可能是有充分理由的,这就是我在评论中询问的原因。
  • 用另一种解决方案解决了这个问题
  • 这些都不起作用;)a)Commandint而不是string(它没有被包裹在"中)b)类需要标记[Serializable]否则 Unity 根本无法反序列化它。 c)object 也不是可序列化的,所以第二件事不能工作!这是一个string(见my answer
猜你喜欢
  • 2022-01-06
  • 1970-01-01
  • 2010-09-22
  • 2012-12-16
  • 2021-10-10
  • 2021-11-23
  • 2014-03-23
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多