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 es List
. ¡Es compatible List
y List
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:
[Serializable]
public class Player
{
public string playerId;
public string playerLoc;
public string playerNick;
}
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.
Player playerInstance = new Player();
playerInstance.playerId = "8484239823";
playerInstance.playerLoc = "Powai";
playerInstance.playerNick = "Random Nick";
//Convert to JSON
string playerToJson = JsonUtility.ToJson(playerInstance);
Debug.Log(playerToJson);
Salida :
{"playerId":"8484239823","playerLoc":"Powai","playerNick":"Random Nick"}
Serialización de la parte B :
Serializa a JSON con la public static string ToJson(object obj, bool prettyPrint);
sobrecarga del método. Simplemente pasar true
a la JsonUtility.ToJson
función formateará los datos. Compare la salida a continuación con la salida anterior.
Player playerInstance = new Player();
playerInstance.playerId = "8484239823";
playerInstance.playerLoc = "Powai";
playerInstance.playerNick = "Random Nick";
//Convert to JSON
string playerToJson = JsonUtility.ToJson(playerInstance, true);
Debug.Log(playerToJson);
Salida :
{
"playerId": "8484239823",
"playerLoc": "Powai",
"playerNick": "Random Nick"
}
Deserializando la Parte A :
Deserializar json con el public static T FromJson(string json);
método overload.
string jsonString = "{\"playerId\":\"8484239823\",\"playerLoc\":\"Powai\",\"playerNick\":\"Random Nick\"}";
Player player = JsonUtility.FromJson<Player>(jsonString);
Debug.Log(player.playerLoc);
Deserializar la parte B :
Deserializar json con el public static object FromJson(string json, Type type);
método overload.
string jsonString = "{\"playerId\":\"8484239823\",\"playerLoc\":\"Powai\",\"playerNick\":\"Random Nick\"}";
Player player = (Player)JsonUtility.FromJson(jsonString, typeof(Player));
Debug.Log(player.playerLoc);
Deserialización de la parte C :
Deserializar json con el public static void FromJsonOverwrite(string json, object objectToOverwrite);
método. Cuando JsonUtility.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.
Player playerInstance;
void Start()
{
//Must create instance once
playerInstance = new Player();
deserialize();
}
void deserialize()
{
string jsonString = "{\"playerId\":\"8484239823\",\"playerLoc\":\"Powai\",\"playerNick\":\"Random Nick\"}";
//Overwrite the values in the existing class instance "playerInstance". Less memory Allocation
JsonUtility.FromJsonOverwrite(jsonString, playerInstance);
Debug.Log(playerInstance.playerLoc);
}
2. DATOS MÚLTIPLES (ARRAY JSON)
Su Json contiene varios objetos de datos. Por ejemplo playerId
apareció más de una vez . Unity JsonUtility
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 funcione JsonUtility
.
Crea una clase llamada JsonHelper
. Copie JsonHelper directamente desde abajo.
public static class JsonHelper
{
public static T[] FromJson<T>(string json)
{
Wrapper<T> wrapper = 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 JsonUtility.ToJson(wrapper);
}
public static string ToJson<T>(T[] array, bool prettyPrint)
{
Wrapper<T> wrapper = new Wrapper<T>();
wrapper.Items = array;
return JsonUtility.ToJson(wrapper, prettyPrint);
}
[Serializable]
private class Wrapper<T>
{
public T[] Items;
}
}
Serialización de la matriz Json :
Player[] playerInstance = new Player[2];
playerInstance[0] = new Player();
playerInstance[0].playerId = "8484239823";
playerInstance[0].playerLoc = "Powai";
playerInstance[0].playerNick = "Random Nick";
playerInstance[1] = new Player();
playerInstance[1].playerId = "512343283";
playerInstance[1].playerLoc = "User2";
playerInstance[1].playerNick = "Rand Nick 2";
//Convert to JSON
string playerToJson = JsonHelper.ToJson(playerInstance, true);
Debug.Log(playerToJson);
Salida :
{
"Items": [
{
"playerId": "8484239823",
"playerLoc": "Powai",
"playerNick": "Random Nick"
},
{
"playerId": "512343283",
"playerLoc": "User2",
"playerNick": "Rand Nick 2"
}
]
}
Deserialización de la matriz Json :
string jsonString = "{\r\n \"Items\": [\r\n {\r\n \"playerId\": \"8484239823\",\r\n \"playerLoc\": \"Powai\",\r\n \"playerNick\": \"Random Nick\"\r\n },\r\n {\r\n \"playerId\": \"512343283\",\r\n \"playerLoc\": \"User2\",\r\n \"playerNick\": \"Rand Nick 2\"\r\n }\r\n ]\r\n}";
Player[] player = JsonHelper.FromJson<Player>(jsonString);
Debug.Log(player[0].playerLoc);
Debug.Log(player[1].playerLoc);
Salida :
Powai
Usuario2
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:
string fixJson(string value)
{
value = "{\"Items\":" + value + "}";
return value;
}
entonces puedes usarlo:
string jsonString = fixJson(yourJsonFromServer);
Player[] player = JsonHelper.FromJson<Player>(jsonString);
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:
{
"USD" : {"15m" : 1740.01, "last" : 1740.01, "buy" : 1740.01, "sell" : 1744.74, "symbol" : "$"},
"ISK" : {"15m" : 179479.11, "last" : 179479.11, "buy" : 179479.11, "sell" : 179967, "symbol" : "kr"},
"NZD" : {"15m" : 2522.84, "last" : 2522.84, "buy" : 2522.84, "sell" : 2529.69, "symbol" : "$"}
}
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:
var N = JSON.Parse(yourJsonString);
string price = N["USD"]["15m"].Value;
Debug.Log(price);
Para obtener la propiedad "15m" de ISK:
var N = JSON.Parse(yourJsonString);
string price = N["ISK"]["15m"].Value;
Debug.Log(price);
Para obtener la propiedad "15m" de NZD:
var N = JSON.Parse(yourJsonString);
string price = N["NZD"]["15m"].Value;
Debug.Log(price);
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 " {}
" con JsonUtility.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 de JsonUtility.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 en JsonHelper.FromJson
lugar de JsonUtility.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
[{"playerId":"1","playerLoc":"Powai"},{"playerId":"2","playerLoc":"Andheri"},{"playerId":"3","playerLoc":"Churchgate"}]
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:
serviceData = "{\"Items\":" + serviceData + "}";
Ahora tu tienes:
{"Items":[{"playerId":"1","playerLoc":"Powai"},{"playerId":"2","playerLoc":"Andheri"},{"playerId":"3","playerLoc":"Churchgate"}]}
Para serializar los múltiples datos de php como matrices , ahora puede hacer
public player[] playerInstance;
playerInstance = JsonHelper.FromJson<player>(serviceData);
playerInstance[0]
son tus primeros datos
playerInstance[1]
son tus segundos datos
playerInstance[2]
es tu tercer dato
o 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 la player
clase. Si es { get; set; }
así, no funcionará. Unidad de JsonUtility
qué NO trabajar con miembros de la clase que se definen como propiedades .
[
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.