Eu tenho uma lista de itens enviados de um arquivo PHP para a unidade usando WWW
.
Os WWW.text
parece:
[
{
"playerId": "1",
"playerLoc": "Powai"
},
{
"playerId": "2",
"playerLoc": "Andheri"
},
{
"playerId": "3",
"playerLoc": "Churchgate"
}
]
Onde eu aparo o extra []
do string
. Quando tento analisá-lo usando Boomlagoon.JSON
, apenas o primeiro objeto é recuperado. Descobri que tenho que deserialize()
entrar na lista e importei o MiniJSON.
Mas estou confuso quanto a deserialize()
esta lista. Quero fazer um loop por cada objeto JSON e recuperar dados. Como posso fazer isso no Unity usando C #?
A classe que estou usando é
public class player
{
public string playerId { get; set; }
public string playerLoc { get; set; }
public string playerNick { get; set; }
}
Depois de aparar o []
, consigo analisar o json usando o MiniJSON. Mas está retornando apenas o primeiro 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));
}
Obrigado!
[
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.List<PlayerLocation>
, porque este é um array.Newtonsoft.Json
), masJson.Deserialize()
SEMPRE retorna aIDictionary<string,object>
para você e você operaList<object>
. Consulte stackoverflow.com/a/22745634/5296568 . De preferência, obtenha um desserializador JSON melhor que faça a desserialização a que você está acostumado.IDictionary<string,object>
. Consigo extrair o valor, mas apenas o primeiroKeyValuePair<>
.Respostas:
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 suportaList
eList
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:
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.Produto :
Serializando a Parte B :
Serialize para Json com a
public static string ToJson(object obj, bool prettyPrint);
sobrecarga do método. Basta passartrue
para aJsonUtility.ToJson
função para formatar os dados. Compare a saída abaixo com a saída acima.Produto :
Desserializando a Parte A :
Desserialize json com a
public static T FromJson(string json);
sobrecarga do método.Desserializando a Parte B :
Desserialize json com a
public static object FromJson(string json, Type type);
sobrecarga do método.Desserializando a Parte C :
Desserialize json com o
public static void FromJsonOverwrite(string json, object objectToOverwrite);
método. QuandoJsonUtility.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.
2. MÚLTIPLOS DADOS (ARRAY JSON)
Seu Json contém vários objetos de dados. Por exemplo,
playerId
apareceu mais de uma vez . O UnityJsonUtility
não suporta array, pois ainda é novo, mas você pode usar uma classe auxiliar desta pessoa para fazer o array funcionarJsonUtility
.Crie uma classe chamada
JsonHelper
. Copie o JsonHelper diretamente de baixo.Serializando Json Array :
Produto :
Desserializando o array Json :
Produto :
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:
então você pode usá-lo:
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:
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:
Para obter a propriedade "15m" da ISK:
Para obter a propriedade "15m" do NZD:
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 "
{}
" comJsonUtility.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 deJsonUtility.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 emJsonHelper.FromJson
vez deJsonUtility.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
Adicionar
{"Items":
na frente dele, em seguida, adicione}
no final do mesmo.Código para fazer isso:
Agora você tem:
Para serializar os vários dados do php como matrizes , agora você pode fazer
playerInstance[0]
são seus primeiros dadosplayerInstance[1]
são seus segundos dadosplayerInstance[2]
é o seu terceiro dadoou 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; }
daplayer
classe. Se você tiver{ get; set; }
, não funcionará. Unidade deJsonUtility
que não trabalhar com os alunos que são definidas como propriedades .fonte
mysql
consulta de PHP usandojson_encode($row)
. Portanto, a resposta consiste em vários JSONObjects no formato[{"playerId":"1","playerLoc":"Powai"},{"playerId":"2","playerLoc":"Andheri"},{"playerId":"3","playerLoc":"Churchgate"}]
. Tentei o JsonUtility, mas não consegui desserializar os objetos e obter objetos json individuais. Se você pode me ajudar com isso.JsonUtility.FromJson
. Esqueci de dizer para você{ get; set; }
sair daplayer
aula. Se você tiver{ get; set; }
, não vai funcionar. Compare suaplayer
aula com a que postei acima e você entenderá o que estou dizendo.JsonHelper
. Está bem. Se você criar Json com ele, também poderá ler json com ele sem etapas extras. A única vez que você pode precisar fazer coisas extras é se estiver recebendo o array json do servidor e isso está incluído na solução na minha resposta. Outra maneiraJsonHelper
é colocar a classe em outra classe e torná-la umaList
. Isso tem funcionado para a maioria das pessoas. Se você está procurando uma maneira de salvar e carregar dados do jogo, veja isto . Você carrega e salva com uma linha de código.Suponha que você tenha um JSON como este
Para analisar o JSON acima na unidade, você pode criar um modelo JSON como este.
E então simplesmente analise da seguinte maneira ...
Agora você pode modificar o JSON / CODE de acordo com sua necessidade. https://docs.unity3d.com/Manual/JSONSerialization.html
fonte
Debug.Log(myObject.result[0].symbol[0].data);
oufor(var i = 0; i <= myObject.result.Length - 1; i ++) { Debug.Log(myObject.result[i].type); }
ouforeach (var item in myObject.result) { Debug.Log(item.type); }
você tem que adicionar
[System.Serializable]
àPlayerItem
classe, assim:fonte
Não apare o
[]
e você deve ficar bem.[]
identifique um array JSON que é exatamente o que você precisa para poder iterar seus elementos.fonte
Como @Maximiliangerhardt disse, o MiniJson não tem a capacidade de desserializar corretamente. Usei o JsonFx e funciona perfeitamente. Funciona com o
[]
fonte
Para ler o arquivo JSON, consulte este exemplo simples
Seu arquivo JSON (StreamingAssets / Player.json)
Script C #
fonte
Você pode usar
Newtonsoft.Json
apenas adicionarNewtonsoft.dll
ao seu projeto e usar o script abaixooutra solução é usar JsonHelper
fonte
SE você estiver usando Vector3, isto é o que eu fiz
1- Eu crio uma classe Name it Player
2- então eu chamo assim
3- e este é o resultado
fonte
Unidade <= 2019
Narottam Goyal teve uma boa ideia de envolver a matriz em um objeto json e, em seguida, desserializar em uma estrutura. O seguinte usa Genéricos para resolver isso para arrays de todos os tipos, em vez de criar uma nova classe sempre.
Pode ser usado da seguinte maneira:
Unity 2020
No Unity 2020, há um pacote oficial da newtonsoft que é uma biblioteca json muito melhor.
fonte