A Unity adicionou JsonUtility à API após a atualização 5.3.3 . Esqueça todas as bibliotecas de terceiros, a menos que esteja fazendo algo mais complicado. JsonUtility é mais rápido do que outras bibliotecas Json. Atualize para a versão Unity 5.3.3 ou superior e tente a solução abaixo.
JsonUtility
é uma API leve. Apenas tipos simples são suportados. Ele não oferece suporte a coleções como Dicionário. Uma exceção é List
. Ele suporta List
e List
array!
Se você precisar serializar Dictionary
ou fazer algo diferente de simplesmente serializar e desserializar tipos de dados simples, use uma API de terceiros. Caso contrário, continue lendo.
Classe de exemplo para serializar:
[Serializable]
public class Player
{
public string playerId;
public string playerLoc;
public string playerNick;
}
1. UM OBJETO DE DADOS (NON-ARRAY JSON)
Serializando a Parte A :
Serialize para Json com o 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);
Produto :
{"playerId":"8484239823","playerLoc":"Powai","playerNick":"Random Nick"}
Serializando a Parte B :
Serialize para Json com a public static string ToJson(object obj, bool prettyPrint);
sobrecarga do método. Basta passar true
para a JsonUtility.ToJson
função para formatar os dados. Compare a saída abaixo com a saída acima.
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);
Produto :
{
"playerId": "8484239823",
"playerLoc": "Powai",
"playerNick": "Random Nick"
}
Desserializando a Parte A :
Desserialize json com a public static T FromJson(string json);
sobrecarga do método.
string jsonString = "{\"playerId\":\"8484239823\",\"playerLoc\":\"Powai\",\"playerNick\":\"Random Nick\"}";
Player player = JsonUtility.FromJson<Player>(jsonString);
Debug.Log(player.playerLoc);
Desserializando a Parte B :
Desserialize json com a public static object FromJson(string json, Type type);
sobrecarga do método.
string jsonString = "{\"playerId\":\"8484239823\",\"playerLoc\":\"Powai\",\"playerNick\":\"Random Nick\"}";
Player player = (Player)JsonUtility.FromJson(jsonString, typeof(Player));
Debug.Log(player.playerLoc);
Desserializando a Parte C :
Desserialize json com o public static void FromJsonOverwrite(string json, object objectToOverwrite);
método. Quando JsonUtility.FromJsonOverwrite
é usado, nenhuma nova instância daquele Objeto que você está desserializando será criada. Ele simplesmente reutilizará a instância que você passou e sobrescreverá seus valores.
Isso é eficiente e deve ser usado, se possível.
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. MÚLTIPLOS DADOS (ARRAY JSON)
Seu Json contém vários objetos de dados. Por exemplo, playerId
apareceu mais de uma vez . O Unity JsonUtility
não suporta array, pois ainda é novo, mas você pode usar uma classe auxiliar desta pessoa para fazer o array funcionar JsonUtility
.
Crie uma classe chamada JsonHelper
. Copie o JsonHelper diretamente de baixo.
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;
}
}
Serializando Json Array :
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);
Produto :
{
"Items": [
{
"playerId": "8484239823",
"playerLoc": "Powai",
"playerNick": "Random Nick"
},
{
"playerId": "512343283",
"playerLoc": "User2",
"playerNick": "Rand Nick 2"
}
]
}
Desserializando o array 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);
Produto :
Powai
User2
Se esta for uma matriz Json do servidor e você não a criou manualmente :
Você pode ter que adicionar {"Items":
na frente da string recebida e adicionar }
no final dela.
Fiz uma função simples para isso:
string fixJson(string value)
{
value = "{\"Items\":" + value + "}";
return value;
}
então você pode usá-lo:
string jsonString = fixJson(yourJsonFromServer);
Player[] player = JsonHelper.FromJson<Player>(jsonString);
3. Deserializar string json sem classe e Deserializar Json com propriedades numéricas
Este é um Json que começa com um número ou propriedades numéricas.
Por exemplo:
{
"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" : "$"}
}
O Unity JsonUtility
não suporta isso porque a propriedade "15m" começa com um número. Uma variável de classe não pode começar com um inteiro.
Baixe SimpleJSON.cs
na wiki do Unity .
Para obter a propriedade "15m" de USD:
var N = JSON.Parse(yourJsonString);
string price = N["USD"]["15m"].Value;
Debug.Log(price);
Para obter a propriedade "15m" da ISK:
var N = JSON.Parse(yourJsonString);
string price = N["ISK"]["15m"].Value;
Debug.Log(price);
Para obter a propriedade "15m" do NZD:
var N = JSON.Parse(yourJsonString);
string price = N["NZD"]["15m"].Value;
Debug.Log(price);
O restante das propriedades Json que não começam com um dígito numérico podem ser manipuladas pelo JsonUtility do Unity.
4. RESOLUÇÃO DE PROBLEMAS JsonUtility:
Problemas ao serializar com JsonUtility.ToJson
?
Obtendo uma string vazia ou " {}
" com JsonUtility.ToJson
?
Um . Certifique-se de que a classe não seja uma matriz. Se for, use a classe auxiliar acima com em JsonHelper.ToJson
vez de JsonUtility.ToJson
.
B . Adicione [Serializable]
ao início da classe que você está serializando.
C . Remova a propriedade da classe. Por exemplo, na variável, public string playerId { get; set; }
remova { get; set; }
. O Unity não pode serializar isso.
Problemas ao desserializar com JsonUtility.FromJson
?
Um . Se você obtiver Null
, certifique-se de que o Json não seja um array Json. Se for, use a classe auxiliar acima com em JsonHelper.FromJson
vez de JsonUtility.FromJson
.
B . Se você conseguir NullReferenceException
ao desserializar, [Serializable]
entre no topo da classe.
C. Quaisquer outros problemas, verifique se seu json é válido. Vá até este site aqui e cole o json. Deve mostrar se o json é válido. Ele também deve gerar a classe adequada com o Json. Apenas certifique-se de remover remove { get; set; }
de cada variável e também adiciona [Serializable]
ao topo de cada classe gerada.
Newtonsoft.Json:
Se por algum motivo for necessário usar o Newtonsoft.Json , verifique a versão bifurcada do Unity aqui . Observe que você pode travar se determinado recurso for usado. Seja cuidadoso.
Para responder à sua pergunta :
Seus dados originais são
[{"playerId":"1","playerLoc":"Powai"},{"playerId":"2","playerLoc":"Andheri"},{"playerId":"3","playerLoc":"Churchgate"}]
Adicionar {"Items":
na frente dele, em seguida, adicione }
no final do mesmo.
Código para fazer isso:
serviceData = "{\"Items\":" + serviceData + "}";
Agora você tem:
{"Items":[{"playerId":"1","playerLoc":"Powai"},{"playerId":"2","playerLoc":"Andheri"},{"playerId":"3","playerLoc":"Churchgate"}]}
Para serializar os vários dados do php como matrizes , agora você pode fazer
public player[] playerInstance;
playerInstance = JsonHelper.FromJson<player>(serviceData);
playerInstance[0]
são seus primeiros dados
playerInstance[1]
são seus segundos dados
playerInstance[2]
é o seu terceiro dado
ou dados dentro da classe com playerInstance[0].playerLoc
, playerInstance[1].playerLoc
, playerInstance[2].playerLoc
......
Você pode usar playerInstance.Length
para verificar o comprimento antes de acessá-lo.
NOTA: Remova { get; set; }
da player
classe. Se você tiver { get; set; }
, não funcionará. Unidade de JsonUtility
que não trabalhar com os alunos que são definidas como propriedades .
[
e]
? Isso é o que o torna uma lista. Apenas pare de removê-lo e desserialize-o como um array ou uma lista e eu espero que tudo funcione. Por favor, poste o código que você tentou.