No desenvolvimento, muitas vezes é necessário converter o objeto Json para o formato de destino ou desserializar a string Json para o objeto de destino. Neste momento, existem alguns detalhes que precisam ser observados.
1. Envie a quebra de linha da string Json para "Console"
No desenvolvimento da lógica de negócios, às vezes é necessário enviar a string Json para o console em uma nova linha, para verificar cuidadosamente os valores de cada atributo na string, e a própria string Json é gerada continuamente, sem a beleza do "recuo de nova linha" Efeito conveniente. Se você quiser consultar o valor de uma propriedade, basta olhar com cuidado no log do console.
Portanto, a string Json é "envolvida e recuada" para a saída aqui, e o efeito semelhante ao "Format Json" no "Notepad++" após a instalação do plug-in "Json Viewer" é obtido:
Considerando que o próprio objeto já é uma "string Json", como os dados do protocolo (conteúdo em data.msg) enviados pelo servidor em alguns projetos. Só que a string em si não tem o efeito estético de “recuo de nova linha” , então aqui é primeiro desserializado e depois serializado novamente com a ajuda de “ Formatting.Indented ” para ter o efeito de “recuo de nova linha”
//将返回的json字符串换行输出到控制台中(便于查看)
if (request.responseCode == 200) {
string msg = request.downloadHandler.text;
var jsonFormat = JsonConvert.SerializeObject(JsonConvert.DeserializeObject(msg),
Formatting.Indented);
Debug.LogFormat("{0}", jsonFormat);
}
O formato original da string Json é o seguinte:
Depois de adicionar " Formatting.Indented ", o efeito do "recuo de nova linha" é o seguinte:
2. Obtenha o valor de um atributo específico na string Json
Se o atributo tiver uma estrutura relativamente simples na string Json , você poderá obter seu valor diretamente combinando a string json
//直接获取json字符串中某个属性的value
if (request.responseCode == 200) {
string msg = request.downloadHandler.text;
JObject jsonObject = JObject.Parse(msg);
string id = jsonObject.GetValue("id").ToString();
Debug.LogFormat("{0}", id);
}
Como acima, corresponda diretamente à string Json "msg" por meio de " JObject.Parse " e, em seguida, obtenha o valor de seu atributo interno "id"
O efeito é o seguinte:
3. Converta a string Json em um objeto do tipo de destino
Use " JsonUtility.FromJson<T>() " no Unity para converter a string Json em um objeto do tipo "T".
Neste ponto, deve-se observar que nem todos os valores de atributo na string Json devem ser correspondidos um a um no tipo "T", apenas alguns atributos de destino precisam ser correspondidos .
Por exemplo, converta a seguinte string Json:
No entanto, a estrutura de conversão real " ChatGPTResponse " não precisa conter todos os atributos na string Json
O tipo "T" "ChatGPTResponse" é o seguinte:
[System.Serializable]
public class ChatGPTResponse
{
public string id;
public ChoiceContent[] choices;
/*public int created;
public string model;*/
[System.Serializable]
public class ChoiceContent
{
public int index;
public ContentData message;
//public int logprobs;
//public string finish_reason;
}
}
[System.Serializable]
public class ContentData
{
public string role;
public string content;
}
/*注意:
*在将json字符串转换成实际的T对象时,并不需要将该json中的所有属性都匹配,
*只需要将需要使用的属性匹配出来即可
*/
A conversão real é a seguinte:
//将json字符串转换成指定类型对象后再获取其中的具体参数值
ChatGPTResponse response = JsonUtility.FromJson<ChatGPTResponse>(msg);
ChatGPTResponse.ChoiceContent[] contents = response.choices;
if (contents.Length > 0) {
//去除字符串开头的”\n\n“换行符
result = contents[0].message.content.TrimStart('\n');
Debug.LogFormat("{0}", result);
}
A saída é a seguinte:
PS : Para remover a quebra de linha "\n\n" na frente da string, você pode usar diretamente " string.TrimStart('\n') "