Как разобрать вложенные объекты JSON, начиная со специальных символов в Unity? - PullRequest
1 голос
/ 26 мая 2019

Я пытаюсь получить эту информацию из MongoDB, и она дает мне этот JSON для решения:

{
    \"values\":
        [ 
            { \"_id\" : { \"$oid\" : \"5ccf1bc55d0e652b8a6c9153\"} , \"Id\" : 5 ,\"Name\" : \" palups\"} , 
            { \"_id\" : { \"$oid\" : \"5ccf24e91f6e4f29b5ede29b\"} , \"Id\" : 2 ,\"Name\" : \"Maria\"} , 
            { \"_id\" : { \"$oid\" : \"5ccf25071f6e4f29b5ede2c5\"} , \"Id\" : 3 ,\"Name\" : \"marcela\"}
        ]
}

Проблема в том, что вложенный объект $ oid.Мне удалось получить Идентификатор и Имя, но не вложенный объект.

Вот что я попробовал:

[System.Serializable]
public class ScoreData {
    public List<Values> values = new List<Values>();
}

[System.Serializable]
public class Values
{
    public _id oid;
    public int Id;
    public string Name;
}

[System.Serializable]
public class _id
{
    public string m_oid;
}

Часть выше - это классы, которые я создал, и код нижеэто функция, предоставленная мне, с моими дополнениями, чтобы она работала так, как я хочу:

IEnumerator getProductsInDB(){
    UnityWebRequest unityWebRequest = UnityWebRequest.Get (baseURL+databaseName+"/collections/"+collectionName+"?apiKey=" + apiKey);
    yield return unityWebRequest.Send();

    if(unityWebRequest.isNetworkError || unityWebRequest.isHttpError) {
        Debug.Log(unityWebRequest.error);
    }
    else {
        //Debug.Log (unityWebRequest.downloadHandler.text);
        jsonString = unityWebRequest.downloadHandler.text;

        string JSONToParse = "{\"values\":" + jsonString + "}"; //estava faltando no json ???

        ScoreData loadedScoreData = JsonUtility.FromJson<ScoreData>(JSONToParse);

        for (int i = 0; i <= loadedScoreData.values.Count; i++)
        {
            Debug.Log("score: " + loadedScoreData.values[i].oid.m_oid);
            Debug.Log("score: " + loadedScoreData.values[i].Id);
            Debug.Log("name: " + loadedScoreData.values[i].Name);
            Debug.Log("****************************************");
        }
    }
}

Вот что я получаю на консоли Unity:

https://imgur.com/a/gQ2ZeZR

(как видите, первая строка пуста).

оценка:

UnityEngine.Debug: Log (Object)

оценка: 999

UnityEngine.Debug: Log (Object)

name: Marcela

UnityEngine.Debug: Log (Object)

Итак, как разобратьвложенное значение или что я делаю не так?

1 Ответ

1 голос
/ 26 мая 2019

Для JsonUtility имена полей в ваших классах должны совпадать с именами в вашей строке JSON.В противном случае «пропущенные» поля будут просто иметь значение по умолчанию (в вашем случае "").

Таким образом, из именования в вашем примере JSON

  • в классеValues это скорее должно быть

    public _id _id;
    
  • в классе _id это будет должно быть

    public string $oid;
    

Однако последнее не является допустимым именем идентификатора в c #

  • Идентификаторы должны начинаться с буквы, или _.
  • Идентификаторы могут содержать буквенные символы Юникода, десятичные цифры, соединительные символы Юникода, комбинирующие символы Юникода или символы форматирования Юникода.Для получения дополнительной информации о категориях Unicode см. База данных категорий Unicode.Вы можете объявить идентификаторы, которые соответствуют ключевым словам C #, используя префикс @ в идентификаторе.@ Не является частью имени идентификатора.Например, @if объявляет идентификатор с именем if.Эти дословные идентификаторы предназначены главным образом для взаимодействия с идентификаторами, объявленными на других языках.

Префикс $ не соответствует этим правилам.

Так что если вы можете 'Я не боюсь, что JsonUtility не поможет вам в этом случае, и вам следует искать другой анализатор Json.


Например, вы можете использовать SimpleJson вЧтобы потом просто извлечь это конкретное поле для каждого экземпляра Values и передать его.


В любом случае

Самое простое решение - удалить или заменить этот специальный символ чем-то другим.прежде чем анализировать его, например,

string JSONToParse = ("{\"values\":" + jsonString + "}").Replace('$', '_');

и, скорее, изменить

[Serializeable]
public class _id
{
    public string _oid;
} 

Также, как прокомментировал сэр Руфо, вы действительно уверены, что должны это сделать

string JSONToParse = ("{\"values\":" + jsonString + "}");

?В своем вопросе вы говорите, что вы уже получили JSON, включая { } и поле values ...

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...