Dave Dave - 1 month ago 13
C# Question

Can't deserialize JSON in Unity 5.4 using JsonUtility. Child collection is always empty

The Model

using System.Collections.Generic;
using UnityEngine;

[System.Serializable]
public class GetPeopleResult
{
public List<Person> people { get; set; }
public GetPeopleResult()
{
this.people = new List<People>();
}

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

}
[System.Serializable]
public class Person
{
public long id { get; set; }
public string name { get; set; }
public string email { get; set; }
public string displayImageUrl { get; set; }

public Person()
{

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


The JSON

{
"people":
[{
"id":1,"name":"John Smith",
"email":"jsmith@acme.com",
"displayImageUrl":"http://example.com/"
}]
}


The Code

string json = GetPeopleJson(); //This works
GetPeopleResult result = JsonUtility.FromJson<GetPeopleResult>(json);


After the call to FromJson, result is not null, but the people collection is always empty.

Answer

After the call to FromJson, result is not null, but the people collection is always empty.

That's because Unity does not support property getter and setter. Remove the { get; set; } from all the classes you want to serialize and that should fix your empty collection.

Also, this.people = new List<People>(); should be this.people = new List<Person>();

[System.Serializable]
public class GetPeopleResult
{
    public List<Person> people;
    public GetPeopleResult()
    {
       this.people = new List<People>();
    }

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

}
[System.Serializable]
public class Person
{
    public long id;
    public string name;
    public string email;
    public string displayImageUrl;

    public Person()
    {

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