首页 > 解决方案 > 统一的json解析方法

问题描述

想在 Unity 中解析 json 但我不知道如何。

我要解析的 json 内容。

{
"route": {
    "trafast": [
            "path": [
                [
                    0,
                    0
                ],

                [
                    1,
                    1
                ],
                [
                    1,
                    2
                ]
            ]

]}}

我必须解析“路径”的内容。

这是我正在编写的代码。

    public static T[] drivingFromJson<T>(string json)
{
    drivingWrapper<T> wrapper = UnityEngine.JsonUtility.FromJson<drivingWrapper<T>>(json);
    return wrapper.trafast;
}

[Serializable]
private class drivingWrapper<T>
{
    public T[] trafast;
}
[System.Serializable]
public class DrivingTrafast
{
    public PathData[] trafast;
}

[System.Serializable]
public class PathData
{
    public TrafastPath[] path;
}

[System.Serializable]
public class TrafastPath
{
    public string[] tp;
}

我不知道如何在“路径”中进行安排。告诉我描述和方法。

标签: jsonunity3d

解决方案


首先,您不能T在以下位置使用泛型()JsonUtility

支持的类型

API 支持任何带有属性的 MonoBehaviour-subclass、 ScriptableObject-subclass 或普通class/ 。你传入的对象会被送入 标准的 Unity 序列化器进行处理,因此与 Inspector 中的规则和限制相同;只有字段被序列化,不支持类似的类型。struct[Serializable]Dictionary<T>

当前不支持将其他类型直接传递给 API,例如原始类型或数组。现在,您需要将此类类型包装在某种类或结构中。

并来自Unity 序列化

如何确保自定义类可以序列化

确保:

  • [Serializable]属性

  • 不是abstract

  • 不是static

  • 不是泛型,尽管它可能继承自泛型类


那么你的 JSON 结构是无效的......它应该是这样的

{
    "route" : {
        "trafast": [
            {
                "path" : [
                    [0,0], [1,1], [1,2]
                ]
            }
        ]
    }
}

trafast包装with的元素{ }(请参阅JSON 中的JSON 数据类型嵌套数组)。


最后,您需要反映此 JSON 结构及其相应类型的 c# 布局。

您可以使用例如json2csharp作为起点,自动为给定的 JSON 生成相应的 c# 布局。您将需要创建所有类[Serializable]并使用正确的字段而不是属性:

[Serializable]
public class RootObject
{
    public Route route;
}

[Serializable]
public class Route
{
    public List<Trafast> trafast;
}

[Serializable]
public class Trafast
{
    public List<List<int>> path;
}

现在你可以使用

var json = "{\"route\" : {\"trafast\": [{\"path\" : [[0,0], [1,1], [1,2] ] } ] } }";

var rootObject = JsonUtility.FromJson<RootObject>(json);

推荐阅读