unity JsonUtility.ToJson returnează un șir gol (Dezvoltarea jocurilor, Unitate, C#, Json)

tatmanblue a intrebat.

Încerc să folosesc serializarea json construită în Unity. Aceasta produce un șir gol. Nu înțeleg de ce. (Am încercat să folosesc NewtonSoft Json.Net, dar nici asta nu a funcționat, chiar dacă am urmat instrucțiunile).

Iată codul de serializare:

public class Player : MonoBehaviour
{
    void Start ()
    {

        Mission a = new Mission()
        {
            Id = 1,
            Name = "Speak to the Farmer",
            State = MissionState.OnGoing,
            Parent = -1,
            Type = MissionType.Main
        };

        string json = JsonUtility.ToJson(a);
        System.IO.File.WriteAllText("missions2.json", json);
    }
}

Iată codul de serializare Mission class:

[Serializable]
public enum MissionState
{
    NotStarted,
    OnGoing,
    Finished
}

[Serializable]
public enum MissionType
{
    Main,
    Sideline
}

[Serializable]
public class Mission
{
    public Mission()
    {
        Parent = -1;
    }

    public int Parent { get; set; }
    public int Id { get; set; }
    public string Name { get; set; }
    public string Description { get; set; }
    public MissionState State { get; set; }
    public MissionType Type { get; set; }
}

Aici este ieșirea:{}

Nu sunt excepții aruncate. Este creat fișierul missions2.json. Dar datele sunt așa cum se arată mai sus. Ce este în neregulă că serializarea nu produce nimic?

ThnxMatt

Comentarii

  • Ați încercat JsonConvert.SerializeObject? Sau folosiți această metodă: stackoverflow.com/a/24432626/644496-  > Por Skyblade.
  • @Skyblade Da. Am încercat să folosesc newtonsoft. Nu am reușit să fac ca unity să compileze cu el. Am urmat instrucțiunile din linkul de lângă partea de sus a postării mele, dar nu am reușit. Dar s-ar putea să revin la el dacă suportul unity json nu funcționează.  > Por tatmanblue.
  • Ați găsit o soluție? Am dori să știm.  > Por ruddy illanes.
  • @ruddyillanes Nu am găsit. În cele din urmă am scris propria mea serializare.  > Por tatmanblue.
  • Există o versiune de Json.Net construită special pentru unity. Evită unele dintre tehnicile mai grele de reflecție / compilare pe care Unity nu le suportă. Este pe Asset store și este gratuit, așa că adăugați-l la proiectul dvs. Folosește aceleași spații de nume și clase ca și Json.Net de la Newtonsoft folosit în tot .Net : assetstore.unity.com/packages/tools/input-management/…–  > Por Basic.
4 răspunsuri
LifGwaethrakindo

dacă îmi amintesc corect, atunci când serializați o clasă C# în JSON, serializează membrii, nu proprietățile (chiar dacă prin {get; set;} compilatorul creează membrii). Poți încerca prin marcarea membrilor ca fiind serializabili cu [SerializeField] sau cu acces public (poți folosi în continuare proprietățile C# pentru a încapsula clasa/structura):

[Serializable]
public class Mission
{
    public Mission()
    {
        Parent = -1;
    }

    [SerializeField] private int Parent;
    [SerializeField] private int Id;
    [SerializeField] private string Name;
    [SerializeField] private string Description;
    [SerializeField] private MissionState State;
    [SerializeField] private MissionType Type;
}

Sper că vă ajută.

Comentarii

  • Aceasta a produs același rezultat pentru mine. Cu alte cuvinte, {}. Deci, din păcate, aceasta nu este o soluție. Mulțumesc totuși pentru răspuns.-  > Por tatmanblue.
  • @tatmanblue Dacă răspunsul nu vă rezolvă problema, de ce îl marcați ca fiind acceptat?-  > Por Vaillancourt.
machineman

Unity nu serializează proprietățile. Trebuie să aveți câmpuri simple pentru a serializa clasa. Este una dintre limitările lui jsonUtility.

Pe scurt,

Utilizați

 public int Parent;

în loc de

 public int Parent { get; set; } 
     

în clasa dumneavoastră.

În caz contrar, utilizați pluginul Newtonsoft.json.

Tony

Unity’s JsonUtility serializează numai câmpurile publice.

//  you don't even need the Serializable attribute when using JsonUtility
public class Mission {
    public int ID; // just a public field, no SerializeField attribute needed either
}

Ar trebui să folosiți biblioteca Json de la Newtonsoft dacă aveți nevoie de mai multă flexibilitate.

세로본능

Cred că ar trebui să adăugați public la fiecare proprietate.

exemplu:

[Serializable]
public class Mission
{
    public Mission()
    {
        Parent = -1;
    }

    [SerializeField] public int Parent;
    [SerializeField] public int Id;
    [SerializeField] public string Name;
    [SerializeField] public string Description;
    [SerializeField] public MissionState State;
    [SerializeField] public MissionType Type;
}

Comentarii

  • Asta schimbă un pic scopul.  > Por Vaillancourt.

Tags:, ,