единственная строка Json приводит к исключению нулевой ссылки - PullRequest
1 голос
/ 02 июля 2019

Попытка получить название местоположения с помощью обратного.Я использую JSONutility Unity для анализа строки JSON, полученной из Google API.Информация не сохраняется в моем локальном объекте, поэтому я всегда получаю исключение нулевой ссылки.

Для извлечения информации, которую я использую, класс UnityWebRequest.Я записал информацию в простой текстовый файл, чтобы проверить, действительно ли отправляется запрос, и информация записывается в текстовый файл, однако, когда я хочу создать из него что-то в игре, это не работает.

Я использовал http://json2csharp.com/ для создания своих классов C # на основе моего файла JSON.

Здесь я проверял файл JSON https://jsonlint.com/

//This is the c# file I created out of the JSON format gotten from google
//It is validated.
using System.Collections;
using System.Collections.Generic;
using UnityEngine;


public class RootObject
{
    public PlusCode plus_code;//This doesn't get created at all
    public List<Result> results;//This creates a list of size 11, however the list is always empty and I don't know why.
    public string status;//For some reason this is the only variable that gets populated

    public static RootObject CreateFromJSON(string jsonString)
    {
        return JsonUtility.FromJson<RootObject>(jsonString);
    }
}

public class PlusCode
{
    public string compound_code;
    public string global_code;
}

public class AddressComponent
{
    public string long_name;
    public string short_name;
    public List<string> types;
}

public class Northeast
{
    public double lat;
    public double lng;
}

public class Southwest
{
    public double lat;
    public double lng;
}

public class Bounds
{
    public Northeast northeast;
    public Southwest southwest;
}

public class Location
{
    public double lat;
    public double lng;
}

public class Northeast2
{
    public double lat;
    public double lng;
}

public class Southwest2
{
    public double lat;
    public double lng;
}

public class Viewport
{
    public Northeast2 northeast;
    public Southwest2 southwest;
}

public class Geometry
{
    public Bounds bounds;
    public Location location;
    public string location_type;
    public Viewport viewport;
}

public class PlusCode2
{
    public string compound_code;
    public string global_code;
}

public class Result
{
    public List<AddressComponent> address_components;
    public string formatted_address;
    public Geometry geometry;
    public string place_id;
    public List<string> types;
    public PlusCode2 plus_code;
}

Ивот откуда я пытаюсь вызвать его.

public void ShowStaticMap()
        {
            //Grab GEO Data
            StartCoroutine(FetchGeoData());
            newCase.date = DateTime.Today.ToString();
            StartCoroutine(GetLocationName());//This runs.
        }


IEnumerator GetLocationName()
        {
            UnityWebRequest www = UnityWebRequest.Get(geoUrl);
            yield return www.SendWebRequest();

            if (www.isNetworkError || www.isHttpError)
            {
                Debug.Log(www.error);
            }
            else
            {
                var TestRootObject = RootObject.CreateFromJSON(www.downloadHandler.text).plus_code.compound_code;// This is line 147. Results in a nullreference exception.
/*
If I am to try this line, it will work without a problem.
RootObject.CreateFromJSON(www.downloadHandler.text).status;
*/
                Debug.Log(TestRootObject);//There is nothing here.
            }
        }

NullReferenceException: ссылка на объект не установлена ​​на экземпляр объекта est.UI.CreateCaseScreen + d__19.MoveNext () (в Assets / Esteban / Scripts/ScreenTypes/CreateCaseScreen.cs:147) UnityEngine.

1 Ответ

2 голосов
/ 02 июля 2019

ОК ... Чувствовать себя здесь глупо.Для тех, кто когда-либо сталкивался с подобной проблемой ... Когда вы создаете сырые классы (как ни в чем, что наследует от чего-либо в Unity ...) Убедитесь, что вы объявили их как [Serializable]

using System;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;


[Serializable] //THIS! On all your classes!!!
public class RootObject
{
    public PlusCode plus_code;
    public List<Result> results;
    public string status;

    public static RootObject CreateFromJSON(string jsonString)
    {
        return JsonUtility.FromJson<RootObject>(jsonString);
    }
}

[Serializable]
public class PlusCode
{
    public string compound_code;
    public string global_code;
}

[Serializable]
public class AddressComponent
{
    public string long_name;
    public string short_name;
    public List<string> types;
}

[Serializable]
public class Northeast
{
    public double lat;
    public double lng;
}

[Serializable]
public class Southwest
{
    public double lat;
    public double lng;
}

[Serializable]
public class Bounds
{
    public Northeast northeast;
    public Southwest southwest;
}

[Serializable]
public class Location
{
    public double lat;
    public double lng;
}

[Serializable]
public class Northeast2
{
    public double lat;
    public double lng;
}

[Serializable]
public class Southwest2
{
    public double lat;
    public double lng;
}

[Serializable]
public class Viewport
{
    public Northeast2 northeast;
    public Southwest2 southwest;
}

[Serializable]
public class Geometry
{
    public Bounds bounds;
    public Location location;
    public string location_type;
    public Viewport viewport;
}

[Serializable]
public class PlusCode2
{
    public string compound_code;
    public string global_code;
}

[Serializable]
public class Result
{
    public List<AddressComponent> address_components;
    public string formatted_address;
    public Geometry geometry;
    public string place_id;
    public List<string> types;
    public PlusCode2 plus_code;
}
...