将JSON字符串解析为对象,然后使用LitJson将其解析为列表

时间:2016-10-11 16:58:40

标签: c# json unity3d litjson

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

[{"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时收到错误“NullReferenceException:Object reference not set not a object of object”。我也试过busInstance.Length,我收到同样的错误。怎么了,我错过了一些我没见过的简单的东西吗?

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

我引用了这篇文章:how to parse json array using Litjson? ......这个帖子就是我建立的。但是,我收到错误提示“类型总线不能充当数组。”

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

注意:我正在使用LitJson和Unity。

1 个答案:

答案 0 :(得分:1)

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

所以,似乎快速修复是改变这一行:

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

对此:

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

我不得不承认我并不是操纵JSON的整个方法的粉丝,因为它对我来说真的很烦人。显然,这样做的目的是为了解决Unity序列化程序中不支持顶级数组的限制。在我看来,更好的方法是不要试图对JSON进行操作(除了剥离外括号,在这种情况下这仍然是一个不幸的必需品),而只是将JSON直接反序列化到您的总线数组中。您可以使用LitJSON轻松完成此操作,这是您最初在&#34; old&#34;中引用的。代码:

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

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