Tengo una lista de elementos enviados desde un archivo PHP a la unidad usando WWW
.
El WWW.text
parece:
[
{
"playerId": "1",
"playerLoc": "Powai"
},
{
"playerId": "2",
"playerLoc": "Andheri"
},
{
"playerId": "3",
"playerLoc": "Churchgate"
}
]
Donde recorto el extra []
del string
. Cuando intento analizarlo usando Boomlagoon.JSON
, solo se recupera el primer objeto. Descubrí que tengo deserialize()
la lista y he importado MiniJSON.
Pero estoy confundido sobre cómo hacer deserialize()
esta lista. Quiero recorrer cada objeto JSON y recuperar datos. ¿Cómo puedo hacer esto en Unity usando C #?
La clase que estoy usando es
public class player
{
public string playerId { get; set; }
public string playerLoc { get; set; }
public string playerNick { get; set; }
}
Después de recortar, []
puedo analizar el json usando MiniJSON. Pero está regresando solo el primero KeyValuePair
.
IDictionary<string, object> players = Json.Deserialize(serviceData) as IDictionary<string, object>;
foreach (KeyValuePair<string, object> kvp in players)
{
Debug.Log(string.Format("Key = {0}, Value = {1}", kvp.Key, kvp.Value));
}
¡Gracias!
[
y]
? Eso es lo que lo convierte en una lista. Simplemente deje de eliminar eso y deserialícelo como una matriz o una lista y espero que esté bien. Publique el código que ha probado.List<PlayerLocation>
, porque se trata de una matriz.Newtonsoft.Json
), peroJson.Deserialize()
SIEMPRE le regresa unIDictionary<string,object>
mensaje y continúa operandoList<object>
. Mire stackoverflow.com/a/22745634/5296568 . Preferiblemente, obtenga un mejor deserializador JSON que realice la deserialización a la que está acostumbrado.IDictionary<string,object>
. Puedo sacar el valor, pero solo el primeroKeyValuePair<>
.Respuestas:
Unity agregó JsonUtility a su API después de la actualización 5.3.3 . Olvídese de todas las bibliotecas de terceros a menos que esté haciendo algo más complicado. JsonUtility es más rápido que otras bibliotecas Json. Actualice a la versión Unity 5.3.3 o superior y luego pruebe la solución a continuación.
JsonUtility
es una API ligera. Solo se admiten tipos simples. No , no admite colecciones tales como diccionario. Una excepción esList
. ¡Es compatibleList
yList
matriz!Si necesita serializar
Dictionary
o hacer algo más que simplemente serializar y deserializar tipos de datos simples, use una API de terceros. De lo contrario, sigue leyendo.Clase de ejemplo para serializar:
1. UN OBJETO DE DATOS (JSON NO ARRAY)
Serializando la Parte A :
Serializa a JSON con el
public static string ToJson(object obj);
método.Salida :
Serialización de la parte B :
Serializa a JSON con la
public static string ToJson(object obj, bool prettyPrint);
sobrecarga del método. Simplemente pasartrue
a laJsonUtility.ToJson
función formateará los datos. Compare la salida a continuación con la salida anterior.Salida :
Deserializando la Parte A :
Deserializar json con el
public static T FromJson(string json);
método overload.Deserializar la parte B :
Deserializar json con el
public static object FromJson(string json, Type type);
método overload.Deserialización de la parte C :
Deserializar json con el
public static void FromJsonOverwrite(string json, object objectToOverwrite);
método. CuandoJsonUtility.FromJsonOverwrite
se usa, no se creará una nueva instancia de ese Objeto al que está deserializando. Simplemente reutilizará la instancia que le pase y sobrescribirá sus valores.Esto es eficaz y debería utilizarse si es posible.
2. DATOS MÚLTIPLES (ARRAY JSON)
Su Json contiene varios objetos de datos. Por ejemplo
playerId
apareció más de una vez . UnityJsonUtility
no es compatible con la matriz, ya que todavía es nueva, pero puede usar una clase auxiliar de esta persona para que la matriz funcioneJsonUtility
.Crea una clase llamada
JsonHelper
. Copie JsonHelper directamente desde abajo.Serialización de la matriz Json :
Salida :
Deserialización de la matriz Json :
Salida :
Si se trata de una matriz Json del servidor y no la creó a mano :
Puede que tenga que agregar
{"Items":
delante de la cadena recibida y luego agregar}
al final.Hice una función simple para esto:
entonces puedes usarlo:
3.Deserializar la cadena json sin clase && Desserializar Json con propiedades numéricas
Este es un Json que comienza con un número o propiedades numéricas.
Por ejemplo:
Unidad
JsonUtility
no admite esto porque la propiedad "15m" comienza con un número. Una variable de clase no puede comenzar con un número entero.Descarga
SimpleJSON.cs
desde la wiki de Unity .Para obtener la propiedad "15m" de USD:
Para obtener la propiedad "15m" de ISK:
Para obtener la propiedad "15m" de NZD:
El resto de las propiedades de Json que no comienzan con un dígito numérico pueden ser manejadas por JsonUtility de Unity.
4.SOLUCIÓN DE PROBLEMAS JsonUtility:
¿Problemas al serializar con
JsonUtility.ToJson
?¿Obteniendo cadena vacía o "
{}
" conJsonUtility.ToJson
?Una . Asegúrese de que la clase no sea una matriz. Si es así, use la clase auxiliar anterior con en
JsonHelper.ToJson
lugar deJsonUtility.ToJson
.B . Agregue
[Serializable]
a la parte superior de la clase que está serializando.C . Eliminar propiedad de la clase. Por ejemplo, en la variable,
public string playerId { get; set; }
elimine{ get; set; }
. Unity no puede serializar esto.¿Problemas al deserializar con
JsonUtility.FromJson
?Una . Si es así
Null
, asegúrese de que Json no sea una matriz Json. Si es así, use la clase auxiliar anterior con enJsonHelper.FromJson
lugar deJsonUtility.FromJson
.B . Si obtiene
NullReferenceException
mientras deserializa, agregue[Serializable]
a la parte superior de la clase.C. Cualquier otro problema, verifique que su json sea válido. Vaya a este sitio aquí y pegue el archivo json. Debería mostrarte si el json es válido. También debería generar la clase adecuada con Json. Solo asegúrese de eliminar eliminar
{ get; set; }
de cada variable y también agregar[Serializable]
a la parte superior de cada clase generada.Newtonsoft.Json:
Si por alguna razón se debe usar Newtonsoft.Json , consulte la versión bifurcada de Unity aquí . Tenga en cuenta que puede experimentar un bloqueo si se utiliza determinada función. Ten cuidado.
Para responder a su pregunta :
Tus datos originales son
Añadir
{"Items":
en la parte delantera de la misma a continuación, añadir}
al final de la misma.Código para hacer esto:
Ahora tu tienes:
Para serializar los múltiples datos de php como matrices , ahora puede hacer
playerInstance[0]
son tus primeros datosplayerInstance[1]
son tus segundos datosplayerInstance[2]
es tu tercer datoo datos dentro de la clase con
playerInstance[0].playerLoc
,playerInstance[1].playerLoc
,playerInstance[2].playerLoc
......Puedes usar
playerInstance.Length
para comprobar la longitud antes de acceder a él.NOTA: Retirar
{ get; set; }
de laplayer
clase. Si es{ get; set; }
así, no funcionará. Unidad deJsonUtility
qué NO trabajar con miembros de la clase que se definen como propiedades .fuente
mysql
consulta desde PHP usandojson_encode($row)
. Entonces, la respuesta consta de múltiples JSONObjects en el formato[{"playerId":"1","playerLoc":"Powai"},{"playerId":"2","playerLoc":"Andheri"},{"playerId":"3","playerLoc":"Churchgate"}]
. Probé JsonUtility, pero no pude deserializar los objetos y obtener objetos json individuales. Si puedes ayudarme con eso.JsonUtility.FromJson
. Olvidé decirte que te quites{ get; set; }
de laplayer
clase. Si es así{ get; set; }
, no funcionará. Compare suplayer
clase con la que publiqué anteriormente y comprenderá lo que estoy diciendo.JsonHelper
. Está bien. Si crea Json con él, también puede leer json con él sin pasos adicionales. La única vez que puede necesitar hacer cosas adicionales es si está recibiendo la matriz json del servidor y eso está incluido en la solución en mi respuesta. Otra formaJsonHelper
es poner la clase en otra clase y luego convertirla enList
. Esto ha funcionado para la mayoría de la gente. Si está buscando una forma de guardar y cargar datos del juego, consulte esto . Carga y guarda con una línea de código.Suponga que tiene un JSON como este
Para analizar el JSON anterior en unidad, puede crear un modelo JSON como este.
Y luego simplemente analice de la siguiente manera ...
Ahora puede modificar el JSON / CODE según sus necesidades. https://docs.unity3d.com/Manual/JSONSerialization.html
fuente
Debug.Log(myObject.result[0].symbol[0].data);
ofor(var i = 0; i <= myObject.result.Length - 1; i ++) { Debug.Log(myObject.result[i].type); }
oforeach (var item in myObject.result) { Debug.Log(item.type); }
tienes que agregar
[System.Serializable]
a laPlayerItem
clase, así:fuente
No recorte el
[]
y debería estar bien.[]
identifique una matriz JSON que es exactamente lo que necesita para poder iterar sus elementos.fuente
Como dijo @Maximiliangerhardt, MiniJson no tiene la capacidad de deserializar correctamente. Usé JsonFx y funciona como un encanto. Funciona con el
[]
fuente
Para leer un archivo JSON, consulte este sencillo ejemplo
Su archivo JSON (StreamingAssets / Player.json)
Script de C #
fuente
Puede usar
Newtonsoft.Json
solo agregarNewtonsoft.dll
a su proyecto y usar el siguiente scriptotra solución está usando JsonHelper
fuente
SI estás usando Vector3 esto es lo que hice
1- creo una clase Name it Player
2- entonces lo llamo así
3- y este es el resultado
fuente
Unidad <= 2019
Narottam Goyal tuvo una buena idea de envolver la matriz en un objeto json y luego deserializar en una estructura. Lo siguiente usa Generics para resolver esto para arreglos de todo tipo, en lugar de crear una nueva clase cada vez.
Se puede utilizar de la siguiente manera:
Unidad 2020
En Unity 2020 hay un paquete oficial de newtonsoft que es una biblioteca json mucho mejor.
fuente