Saltar al contenido

Serializar y deserializar Json y Json Array en Unity

Hola, hallamos la solución a lo que buscabas, has scroll y la encontrarás a continuación.

Solución:

Unity agregó JsonUtility a su API después 5.3.3 Actualizar. 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. Actualización a Unity 5.3.3 versión o superior, pruebe la solución a continuación.

JsonUtility es una API ligera. Solo se admiten tipos simples. Lo hace no Admite colecciones como Dictionary. Una excepción es List. Es compatible List y List array!

Si necesita serializar un 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)

Serializar la parte A:

Publicar por fascículos 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);

Producción:

"playerId":"8484239823","playerLoc":"Powai","playerNick":"Random Nick"

Serialización de la parte B:

Publicar por fascículos a Json con el public static string ToJson(object obj, bool prettyPrint); sobrecarga de métodos. Simplemente pasando true al JsonUtility.ToJson La función formateará los datos. Compare la salida de abajo con la salida de arriba.

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);

Producción:


    "playerId": "8484239823",
    "playerLoc": "Powai",
    "playerNick": "Random Nick"


Deserializando la parte A:

Deserializar json con el public static T FromJson(string json); sobrecarga de métodos.

string jsonString = ""playerId":"8484239823","playerLoc":"Powai","playerNick":"Random Nick"";
Player player = JsonUtility.FromJson(jsonString);
Debug.Log(player.playerLoc);

Deserialización de la parte B:

Deserializar json con el public static object FromJson(string json, Type type); sobrecarga de métodos.

string jsonString = ""playerId":"8484239823","playerLoc":"Powai","playerNick":"Random Nick"";
Player player = (Player)JsonUtility.FromJson(jsonString, typeof(Player));
Debug.Log(player.playerLoc);

Deserializando la Parte C:

Deserializar json con el public static void FromJsonOverwrite(string json, object objectToOverwrite); método. Cuando JsonUtility.FromJsonOverwrite se utiliza, no se creará ninguna 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. Unidad JsonUtility no soporta array ya que todavía es nuevo, pero puede usar una clase de ayuda de esta persona para obtener array trabajando con JsonUtility.

Crea una clase llamada JsonHelper. Copie JsonHelper directamente desde abajo.

public static class JsonHelper

    public static T[] FromJson(string json)
    
        Wrapper wrapper = JsonUtility.FromJson>(json);
        return wrapper.Items;
    

    public static string ToJson(T[] array)
    
        Wrapper wrapper = new Wrapper();
        wrapper.Items = array;
        return JsonUtility.ToJson(wrapper);
    

    public static string ToJson(T[] array, bool prettyPrint)
    
        Wrapper wrapper = new Wrapper();
        wrapper.Items = array;
        return JsonUtility.ToJson(wrapper, prettyPrint);
    

    [Serializable]
    private class Wrapper
    
        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);

Producción:


    "Items": [
        
            "playerId": "8484239823",
            "playerLoc": "Powai",
            "playerNick": "Random Nick"
        ,
        
            "playerId": "512343283",
            "playerLoc": "User2",
            "playerNick": "Rand Nick 2"
        
    ]


Deserialización de la matriz Json:

string jsonString = "rn    "Items": [rn        rn            "playerId": "8484239823",rn            "playerLoc": "Powai",rn            "playerNick": "Random Nick"rn        ,rn        rn            "playerId": "512343283",rn            "playerLoc": "User2",rn            "playerNick": "Rand Nick 2"rn        rn    ]rn";

Player[] player = JsonHelper.FromJson(jsonString);
Debug.Log(player[0].playerLoc);
Debug.Log(player[1].playerLoc);

Producción:

Powai

Usuario2


Si esto es un Json array desde el servidor y no lo creaste a mano:

Puede que tenga que agregar "Items": frente al recibido string Luego añade al final de la misma.

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(jsonString);

3.Deserializar json string 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.

Descargar SimpleJSON.cs de 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?

Vaciarse string o “” con JsonUtility.ToJson?

A. Asegúrese de que la clase no sea un array. Si es así, use la clase auxiliar anterior con JsonHelper.ToJson en lugar de JsonUtility.ToJson.

B. Agregar [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; retirar get; set; . Unity no puede serializar esto.

Problemas al deserializar con JsonUtility.FromJson?

A. Si lo consigues Null, asegúrese de que el Json no sea un Json array. Si es así, use la clase auxiliar anterior con JsonHelper.FromJson en lugar de JsonUtility.FromJson.

B. Si lo consigues NullReferenceException mientras se deserializa, agregue [Serializable] a la cima 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úrate de eliminar retirar get; set; de cada variable y también agregue [Serializable] a la parte superior de cada clase generada.


Newtonsoft.Json:

Si por alguna razón Newtonsoft.Json debe usarse, luego consulte la versión bifurcada para Unity aquí. Tenga en cuenta que puede experimentar un bloqueo si se utiliza determinada función. Ten cuidado.


Para responder tu pregunta:

Tus datos originales son

 ["playerId":"1","playerLoc":"Powai","playerId":"2","playerLoc":"Andheri","playerId":"3","playerLoc":"Churchgate"]

Agregar"Items": en parte delantera de eso entonces agregar en el fin de ella.

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 publicar por fascículos los múltiple datos de php como matrices, ahora puedes hacer

public player[] playerInstance;
playerInstance = JsonHelper.FromJson(serviceData);

playerInstance[0] son tus primeros datos

playerInstance[1] es tu segundo dato

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: Eliminar get; set; desde el player clase. Si usted tiene get; set; , no funcionará. Unidad JsonUtility lo hace NO trabajar con miembros de la clase que se definen como propiedades.

Suponga que tiene un JSON como este

[
    
        "type": "qrcode",
        "symbol": [
            
                "seq": 0,
                "data": "HelloWorld9887725216",
                "error": null
            
        ]
    
]

Para analizar el JSON anterior en unidad, puede crear un modelo JSON como este.

[System.Serializable]
public class QrCodeResult

    public QRCodeData[] result;


[System.Serializable]
public class Symbol

    public int seq;
    public string data;
    public string error;


[System.Serializable]
public class QRCodeData

    public string type;
    public Symbol[] symbol;

Y luego simplemente analice de la siguiente manera …

var myObject = JsonUtility.FromJson(""result":" + jsonString.ToString() + "");

Ahora puede modificar el JSON / CODE según sus necesidades. https://docs.unity3d.com/Manual/JSONSerialization.html

tienes que agregar [System.Serializable] para PlayerItem clase, así:

using System;
[System.Serializable]
public class PlayerItem   
    public string playerId;
    public string playerLoc;
    public string playerNick;

Si para ti ha resultado de provecho este artículo, sería de mucha ayuda si lo compartes con otros seniors así contrubuyes a difundir este contenido.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *