Skip to content

Instantly share code, notes, and snippets.

@onionmk2
Last active August 17, 2022 20:08
Show Gist options
  • Save onionmk2/d2e3e4cca27a37a89796e084e05de212 to your computer and use it in GitHub Desktop.
Save onionmk2/d2e3e4cca27a37a89796e084e05de212 to your computer and use it in GitHub Desktop.
Json.Net ( Newtonsoft.Json ) in Unity
using System;
using System.Collections.Generic;
using System.IO;
using Newtonsoft.Json;
using UnityEngine;
public class UsingJsonDotNetInUnity : MonoBehaviour
{
private void Awake()
{
var accountJames = new Account
{
Email = "james@example.com",
Active = true,
CreatedDate = new DateTime(2013, 1, 20, 0, 0, 0, DateTimeKind.Utc),
Roles = new List<string>
{
"User",
"Admin"
},
Ve = new Vector3(10, 3, 1),
StrVector3Dictionary = new Dictionary<string, Vector3>
{
{"start", new Vector3(0, 0, 1)},
{"end", new Vector3(9, 0, 1)}
}
};
var accountOnion = new Account
{
Email = "onion@example.co.uk",
Active = true,
CreatedDate = new DateTime(2013, 1, 20, 0, 0, 0, DateTimeKind.Utc),
Roles = new List<string>
{
"User",
"Admin"
},
Ve = new Vector3(0, 3, 1),
StrVector3Dictionary = new Dictionary<string, Vector3>
{
{"vr", new Vector3(0, 0, 1)},
{"pc", new Vector3(9, 9, 1)}
}
};
var setting = new JsonSerializerSettings();
setting.Formatting = Formatting.Indented;
setting.ReferenceLoopHandling = ReferenceLoopHandling.Ignore;
// write
var accountsFromCode = new List<Account> {accountJames, accountOnion};
var json = JsonConvert.SerializeObject(accountsFromCode, setting);
var path = Path.Combine(Application.dataPath, "hi.json");
File.WriteAllText(path, json);
// read
var fileContent = File.ReadAllText(path);
var accountsFromFile = JsonConvert.DeserializeObject<List<Account>>(fileContent);
var reSerializedJson = JsonConvert.SerializeObject(accountsFromFile, setting);
print(reSerializedJson);
print("json == reSerializedJson is" + (json == reSerializedJson));
}
public class Account
{
public string Email { get; set; }
public bool Active { get; set; }
public DateTime CreatedDate { get; set; }
public IList<string> Roles { get; set; }
public Vector3 Ve { get; set; }
public Dictionary<string, Vector3> StrVector3Dictionary { get; set; }
}
}
@onionmk2
Copy link
Author

onionmk2 commented Jun 23, 2017

How To Use

  1. Download Json.Net from https://github.com/JamesNK/Newtonsoft.Json/releases
  2. Move \Bin\net35\Newtonsoft.Json.dll to Asset\
  3. Add NewBehaviourScript.cs to any object in Scene
  4. Play

@onionmk2
Copy link
Author

onionmk2 commented Jun 23, 2017

Why Json.Net ?

According to https://stackoverflow.com/questions/36239705/serialize-and-deserialize-json-and-json-array-in-unity,

  1. Unity's JsonUtility does not support array as it is still new.
  2. Unity's JsonUtility can not serialize property.
  3. Unity's JsonUtility can not serialize Dictonary.

so, Json.Net may be better.

@onionmk2
Copy link
Author

Result

  1. Json.Net does support array as it is still new.
  2. Json.Net can serialize property.
  3. Json.Net can serialize Dictonary.

image

@ehsanwwe
Copy link

it doesn't work on publish just work on Editor

@applejag
Copy link

applejag commented Jul 18, 2019

For support in built versions, recommended to use one of following

Or if you dont require Newtonsoft.Json (Json.NET), here's some other alternatives (all works in Unity, I've omitted libraries that don't, and there's a lot of 'em):

There is quite the table of candy to select from. Choose well young padawans~

@helixen
Copy link

helixen commented Dec 13, 2019

Hello! Do you know if this library works on Android, my app stops at JsonConvert.DeserializeObject without error or crashing it just skips the rest of the method, on editor everything works fine using the library.

Thanks in advance.

@applejag
Copy link

@helixen I know for a fact mine does https://github.com/jilleJr/Newtonsoft.Json-for-Unity

It could be that your code is throwing. That would quit the function but not the game. You could try doing a development build, then uncatched exceptions are viewed on screen.

@helixen
Copy link

helixen commented Dec 13, 2019

I could catch the problem, the error is that the JsonConvert.DeserializeObject cannot deserialize an array to IEnumrable, but it only happens when it's running on Android device, I'm in a hurry for delivery so I had to use another library. I'm testing on Samsung Galaxy S9 Android Version 9.

@Hubinga
Copy link

Hubinga commented Apr 7, 2020

Thanks a lot now we managed it working in built version. <3

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment