Reputation: 1
I'm currently struggling with JSON parsing.
My json file has been generated with Construct 2, it contains json files (maps) inside this one json (map pack)
Here's an example of a map pack (contains only one map)
{"c2array":true,"size":[1,1,1],"data":[[["{\"c2array\":true,\"size\":[22,9,1],\"data\":[[[\"wall\"],[0],[0],[10],[480],[0],[0],[0],[0]],[[\"wall\"],[0],[470],[860],[10],[0],[0],[0],[0]],[[\"wall\"],[850],[0],[10],[470],[0],[0],[0],[0]],[[\"wall\"],[10],[0],[840],[10],[0],[0],[0],[0]],[[\"wall\"],[160],[190],[110],[140],[0],[0],[0],[0]],[[\"wall\"],[340],[280],[140],[130],[0],[0],[0],[0]],[[\"wall\"],[520],[120],[190],[150],[0],[0],[0],[0]],[[\"plateform\"],[415],[140],[0],[0],[0],[0],[0],[0]],[[\"plateform\"],[195],[160],[0],[0],[0],[1],[5],[5]],[[\"launcher\"],[415],[280],[0],[0],[0],[0],[5],[1]],[[\"ray\"],[15],[90],[0],[0],[0],[0],[5],[1]],[[\"spawn\"],[365],[265],[0],[0],[0],[0],[0],[0]],[[\"mine\"],[465],[280],[0],[0],[0],[0],[5],[0]],[[\"plateformspike\"],[65],[350],[0],[0],[0],[0],[0],[0]],[[\"plateformspike\"],[185],[390],[0],[0],[0],[1],[10],[2]],[[\"spike\"],[520],[185],[0],[0],[270],[0],[0],[0]],[[\"spike\"],[545],[270],[0],[0],[180],[0],[0],[0]],[[\"spike\"],[635],[270],[0],[0],[180],[0],[0],[0]],[[\"spike\"],[710],[175],[0],[0],[90],[0],[0],[0]],[[\"spike\"],[645],[120],[0],[0],[0],[0],[0],[0]],[[\"spike\"],[615],[470],[0],[0],[0],[0],[0],[0]],[[\"flag\"],[225],[190],[0],[0],[0],[0],[0],[0]]]}"]]]}
Now to load this json file i'm using the follow C# script:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using System.IO;
using System;
public class mapLoad : MonoBehaviour {
public string jsonString;
public C2Map valeur;
public bool c2array;
public List<int> size;
public List<List<List<string>>> data;
// Use this for initialization
void Start () {
jsonString = File.ReadAllText(Application.dataPath + "/Maps/MapFiles/Test/document.json");
C2Map valeur = C2Map.CreateFromJSON(jsonString);
c2array = valeur.c2array;
size = valeur.size;
data = valeur.data;
}
// Update is called once per frame
void Update () {
}
}
[System.Serializable]
public class C2Map
{
public bool c2array;
public List<int> size;
public List<List<List<string>>> data;
public static C2Map CreateFromJSON(string jsonString)
{
return JsonUtility.FromJson<C2Map>(jsonString);
}
}
Everything before the "data" field works but once it goes to data, the public variable gets destroyed, I've tried different methods but it either return null or destroy the variable, no errors, nothing
Upvotes: 0
Views: 5046
Reputation: 125455
You have List of List of List variable:
public List<List<List<string>>> data;
The JsonUtility
API does not support this. JsonUtility
only supports simple types. If you try to serialize a class that contains that variable above, you will get []
and likely null when you try to de-serialize it.
You have two options:
1.Write a wrapper for the List<List<List<string>>>
[System.Serializable]
public class ListWrapper
{
public List<ThirdList> secondList;
}
[System.Serializable]
public class ThirdList
{
public List<string> thirdList;
}
then
declare it as public List<ListWrapper> data;
in your C2Map
class.
2.Use Newtonsoft.Json the forked version for Unity. You can get that here. The standard Newtonsoft.Json wouldn't work in Unity.
Upvotes: 3
Reputation: 174
doing some reverse engineering clears out JsonUtility of Unity has a weird behavior with nested arrays and return nulls . but you can make use of newtonsoft json deserializer, it supports wide variety of .Net versions including 3.5 for unity.
simply put the dll file in Plugins folder and it wont return null anymore:
public static C2Map CreateFromJSON(string jsonString)
{
return JsonConvert.DeserializeObject<C2Map>(jsonString);
}
https://www.newtonsoft.com/json
Upvotes: 0