Unity-Technologies/UnityCsReference · error · JSONTypeException
Tried to read {} json value as list
Error message
Tried to read {} json value as list What it means
JSONValue.AsList(bool nothrow) returns the value only when it is a List<JSONValue>; otherwise it builds a message of the form "Tried to read <ActualType> json value as list" using data.GetType().Name, so the placeholder in the message reflects the real wrapped CLR type (e.g. String, Dictionary`2, Single). The parameterless AsList() throws via the nothrow=false path. This fires whenever code indexes into something that the JSON modeled as an object or scalar rather than an array.
Source
Thrown at Editor/Mono/AssetStore/Json.cs:121
{
if (data is bool)
return (bool)data;
if (!nothrow)
throw new JSONTypeException("Tried to read non-bool json value as bool");
return false;
}
public bool AsBool()
{
return AsBool(false);
}
public List<JSONValue> AsList(bool nothrow)
{
if (data is List<JSONValue>)
return (List<JSONValue>)data;
if (!nothrow)
throw new JSONTypeException("Tried to read " + data.GetType().Name + " json value as list");
return null;
}
public List<JSONValue> AsList()
{
return AsList(false);
}
public Dictionary<string, JSONValue> AsDict(bool nothrow)
{
if (data is Dictionary<string, JSONValue>)
return (Dictionary<string, JSONValue>)data;
if (!nothrow)
throw new JSONTypeException("Tried to read non-dictionary json value as dictionary");
return null;
}
public Dictionary<string, JSONValue> AsDict()View on GitHub (pinned to 225b0fbdb5)
Solutions
- Check IsList() before calling AsList(), or use AsList(true) which returns null on mismatch.
- Handle the single-object-vs-array variants explicitly by testing the wrapped type.
- Confirm the field is present and is an array in the schema before parsing.
Example fix
// before
foreach (var item in node["items"].AsList()) { ... } // throws if items is an object
// after
var items = node["items"].AsList(true) ?? new List<JSONValue>();
// or, when a single object should be treated as a 1-element list:
if (!node["items"].IsList() && node["items"].IsDict())
items = new List<JSONValue> { node["items"] }; Defensive patterns
Strategy: type-guard
Validate before calling
List<JSONValue> ReadList(JSONValue v) {
var list = v.AsList(true);
if (list != null) return list;
if (v.IsDict()) return new List<JSONValue> { v }; // tolerate single-object form
return new List<JSONValue>();
} Type guard
static List<JSONValue> AsListOrEmpty(JSONValue v) => v.AsList(true) ?? new List<JSONValue>();
Try / catch
List<JSONValue> arr;
try { arr = v.AsList(); } catch (JSONTypeException) { arr = new List<JSONValue>(); } Prevention
- Handle the single-object-vs-array variants explicitly for fields known to collapse.
- Use AsList(true) and null-check instead of letting the throw propagate.
- Confirm array fields are present and typed as arrays in the schema.
When it happens
Trigger: Calling AsList() on a JSON object or scalar (e.g. node["items"].AsList() when "items" is an object keyed by id, or when the server omitted the array and returned null); iterating a field that is sometimes an array and sometimes a single object.
Common situations: API collapses a one-element array to a single object; missing field serialized as null; field renamed/repurposed.
Related errors
- Tried to read non-string json value as string
- Tried to read non-float json value as float
- Tried to read non-bool json value as bool
- Tried to read non-dictionary json value as dictionary
- Cannot serialize json value of unknown type
AI-assisted analysis of Unity-Technologies/UnityCsReference@225b0fbdb5 (2026-08-13).
Data as JSON: /api/errors/0a907f3050aade0f.
Report an issue: GitHub.