我正在尝试解析这个字符串:
[{"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。
答案 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
的单个实例。保持变量名称准确对其他人来说非常重要,以便能够理解您的代码。