0

我正在尝试解析这个字符串:

[{"busses":[{"bus":1,"time":"2016-10-11 04:56:01","lat":"30.5198498","lon":"-90.47052981","acc":"6.0\n"},{"bus":2,"time":"2016-10-11 11:37:55","lat":"30.51764384","lon":"-90.47189947","acc":"3.0\n"},{"bus":3,"time":"2016-10-05 03:52:11","lat":"30.51982784","lon":"-90.47063428","acc":"8.0\n"},{"bus":4,"time":"2016-10-11 11:37:56","lat":"30.51998849","lon":"-90.47060976","acc":"3.0\n"}]}]

这是我的旧代码...:

public class Bus
{
    public string busNum { get; set; }
    public string busTime { get; set; }
    public string busLat { get; set; }
    public string busLon { get; set; }
    public string busAcc { get; set; }
}

public class Busses
{
    public List<Bus> busses { get; set; }
}

public class TestCoordinate : MonoBehaviour
{
    private float nextActionTime = 0.0f;
    private float period = 5.0f;
    void Start()
    {

    }
    void Update()
    {
        if (Time.time > nextActionTime)
        {
            nextActionTime = Time.time + period;
            StartCoroutine("GetCoordinatesUpdate");
        }

    }

    IEnumerator GetCoordinatesUpdate()
    {
        WWW www = new WWW("Myurl.com");
        yield return www;
        string cleanurl = www.text.Replace("(", "").Replace(")", "");
        string finalurl = "[{\"busses\":" + cleanurl + "}]";
        Debug.Log(finalurl);
        Busses busses = JsonMapper.ToObject<Busses>(finalurl);
    }
}

编辑:引用链接后:Serialize and Deserialize Json and Json Array in Unity,我已将代码更改为此,请参阅下面的错误:

    public class Bus
{
    public string bus;
    public string Time;
    public string Lat;
    public string Lon;
    public string Acc;
}

public static class JsonHelper
{
    public static T[] FromJson<T>(string json)
    {
        Wrapper<T> wrapper = UnityEngine.JsonUtility.FromJson<Wrapper<T>>(json);
        return wrapper.Items;
    }

    public static string ToJson<T>(T[] array)
    {
        Wrapper<T> wrapper = new Wrapper<T>();
        wrapper.Items = array;
        return UnityEngine.JsonUtility.ToJson(wrapper);
    }

    [Serializable]
    private class Wrapper<T>
    {
        public T[] Items;
    }
}

public class TestCoordinate : MonoBehaviour
{
    private float nextActionTime = 0.0f;
    private float period = 5.0f;
    public Bus[] busInstance;
    public string lat;
    void Start()
    {

    }
    void Update()
    {
        if (Time.time > nextActionTime)
        {
            nextActionTime = Time.time + period;
            StartCoroutine("GetCoordinatesUpdate");
        }

    }

    IEnumerator GetCoordinatesUpdate()
    {
        //string url = "http://gdata.selu.edu/traxx/allpositions2.php";
        WWW www = new WWW("http://gdata.selu.edu/traxx/allpositions2.php");
        yield return www;
        string cleanurl = www.text.Replace("(", "").Replace(")", "").Replace("\n","");
        string finalurl = "{\"busses\":" + cleanurl + "}";
        Debug.Log(finalurl);  
        busInstance = JsonHelper.FromJson<Bus>(finalurl);
        lat = busInstance[0].Lat;
        Debug.Log(lat);        
    }
}

注意:但是现在我在尝试显示 lat. 我也试过 busInstance.Length,我收到了同样的错误。怎么了,我错过了一些我没有看到的简单的东西吗?

我正在尝试使用 LitJson 的 JsonMapper.ToObject 将 4 条总线放入列表中。

我引用了这篇文章:如何使用 Litjson 解析 json 数组? ...而那篇文章就是我建立的。但是,我收到一条错误消息,提示“类型总线不能充当数组”。

您会看到我已将“[{busses:” 连接到字符串,以使其类似于我引用的帖子。

注意:我使用的是 LitJson 和 Unity。

4

1 回答 1

1

是的,你错过了一些简单的东西。在您引用的帖子中,他们正在操纵 JSON 以用{ "Items":和包围它}。然后该类使用这个额外的 JSON 位JsonHelper.Wapper<T>来提取 JSON 数组。Wrapper 类取决于外部属性的名称为“Items”,但您已将其更改为“busses”。因此,反序列化程序无法填充 Items 数组,该数组保持为空,然后最终分配给您的busInstance变量。由于busInstance为 null,当您尝试访问时会收到 NullReferenceException busInstance[0].Lat

因此,似乎快速解决方法是更改​​此行:

string finalurl = "{\"busses\":" + cleanurl + "}";

对此:

string finalurl = "{\"Items\":" + cleanurl + "}";

我不得不承认我不喜欢这种操纵 JSON 的整个方法,因为它对我来说真的很hacky。显然,这样做的全部目的是绕过 Unity 序列化程序中不支持顶级数组的限制。在我看来,更好的方法是根本不尝试修改 JSON(除了去掉外括号,在这种情况下这仍然是一种不幸的必要性),而是直接将 JSON 反序列化到您的 Bus 数组中。您可以使用最初在“旧”代码中引用的 LitJSON 轻松完成此操作:

busInstance = JsonMapper.ToObject<Bus[]>(cleanurl);

顺便说一句,我建议将您的busInstance变量重命名为,busArray因为它是一个数组而不是Bus. 保持变量名称准确对于其他人能够理解您的代码很重要。

于 2016-10-11T21:03:12.517 回答