Сериализация и десериализация Json и Json Array в Unity

У меня есть список элементов, отправленных из файла PHP в единство с использованием WWW.

WWW.text выглядит так:

[
    {
        "playerId": "1",
        "playerLoc": "Powai"
    },
    {
        "playerId": "2",
        "playerLoc": "Andheri"
    },
    {
        "playerId": "3",
        "playerLoc": "Churchgate"
    }
]

Где я обрезал лишние [] от string. Когда я пытаюсь разобрать его с помощью Boomlagoon.JSON, извлекается только первый объект. Я обнаружил, что мне нужно deserialize() список, и импортировал MiniJSON.

Но я не понимаю, как deserialize() этот список. Я хочу перебрать каждый объект JSON и получить данные. Как я могу сделать это в Unity с помощью C #?

Я использую класс

public class player
{
    public string playerId { get; set; }
    public string playerLoc { get; set; }
    public string playerNick { get; set; }
}

После обрезки [] я могу проанализировать json с помощью MiniJSON. Но он возвращает только первые KeyValuePair.

IDictionary<string, object> players = Json.Deserialize(serviceData) as IDictionary<string, object>;

foreach (KeyValuePair<string, object> kvp in players)
{
    Debug.Log(string.Format("Key = {0}, Value = {1}", kvp.Key, kvp.Value));
}

Спасибо!


person dil33pm    schedule 26.03.2016    source источник
comment
Почему вы удалили внешние [ и ]? Вот что делает его списком. Просто прекратите удалять это и десериализуйте его как массив или список, и я ожидаю, что все будет в порядке. Пожалуйста, опубликуйте код, который вы пробовали.   -  person Jon Skeet    schedule 26.03.2016
comment
Покажите нам класс, используемый для десериализации. Формат странный, почему второй playerId не заключен в фигурные скобки? Он должен десериализоваться в список чего-то вроде List<PlayerLocation>, потому что этот является массивом.   -  person Maximilian Gerhardt    schedule 26.03.2016
comment
@MaximilianGerhardt Извините, фигурные скобки были опечаткой. Исправил это в вопросе и также добавил код. Спасибо.   -  person dil33pm    schedule 26.03.2016
comment
Я думаю, что что-то не так с вашим пониманием того, как эта библиотека обрабатывает десериализацию. Это не обычная десериализация (как вы, возможно, видели в Newtonsoft.Json), но Json.Deserialize() ВСЕГДА возвращает вам IDictionary<string,object>, и вы работаете с List<object>. Посмотрите на stackoverflow.com/a/22745634/5296568. Желательно получить лучший десериализатор JSON, который выполняет десериализацию, к которой вы привыкли.   -  person Maximilian Gerhardt    schedule 26.03.2016
comment
@MaximilianGerhardt Я пробовал с IDictionary<string,object>. Я могу получить значение, но только первое KeyValuePair<>.   -  person dil33pm    schedule 27.03.2016


Ответы (9)


Unity добавила JsonUtility в свой API после обновления 5.3.3. Забудьте обо всех сторонних библиотеках, если вы не делаете что-то более сложное. JsonUtility быстрее, чем другие библиотеки Json. Обновите Unity до версии 5.3.3 или более поздней и попробуйте решение, указанное ниже.

JsonUtility - легкий API. Поддерживаются только простые типы. Он не поддерживает такие коллекции, как Dictionary. Одно исключение - List. Он поддерживает массивы List и List!

Если вам нужно сериализовать Dictionary или сделать что-то иное, кроме простой сериализации и десериализации простых типов данных, используйте сторонний API. В противном случае продолжайте чтение.

Пример класса для сериализации:

[Serializable]
public class Player
{
    public string playerId;
    public string playerLoc;
    public string playerNick;
}

1. ОДИН ОБЪЕКТ ДАННЫХ (НЕ МАССИВНЫЙ JSON)

Сериализация части A:

Сериализовать в Json с помощью метода public static string ToJson(object obj);.

Player playerInstance = new Player();
playerInstance.playerId = "8484239823";
playerInstance.playerLoc = "Powai";
playerInstance.playerNick = "Random Nick";

//Convert to JSON
string playerToJson = JsonUtility.ToJson(playerInstance);
Debug.Log(playerToJson);

Вывод:

{"playerId":"8484239823","playerLoc":"Powai","playerNick":"Random Nick"}

Сериализация части Б:

Сериализовать в Json с помощью перегрузки метода public static string ToJson(object obj, bool prettyPrint);. Простая передача true функции JsonUtility.ToJson отформатирует данные. Сравните вывод ниже с выводом выше.

Player playerInstance = new Player();
playerInstance.playerId = "8484239823";
playerInstance.playerLoc = "Powai";
playerInstance.playerNick = "Random Nick";

//Convert to JSON
string playerToJson = JsonUtility.ToJson(playerInstance, true);
Debug.Log(playerToJson);

Вывод:

{
    "playerId": "8484239823",
    "playerLoc": "Powai",
    "playerNick": "Random Nick"
}

Десериализация части A:

Десериализуйте json с помощью перегрузки метода public static T FromJson(string json);.

string jsonString = "{\"playerId\":\"8484239823\",\"playerLoc\":\"Powai\",\"playerNick\":\"Random Nick\"}";
Player player = JsonUtility.FromJson<Player>(jsonString);
Debug.Log(player.playerLoc);

Десериализация части Б:

Десериализовать json с помощью перегрузки метода public static object FromJson(string json, Type type);.

string jsonString = "{\"playerId\":\"8484239823\",\"playerLoc\":\"Powai\",\"playerNick\":\"Random Nick\"}";
Player player = (Player)JsonUtility.FromJson(jsonString, typeof(Player));
Debug.Log(player.playerLoc);

Десериализация части C:

Десериализуйте json с помощью метода public static void FromJsonOverwrite(string json, object objectToOverwrite);. Когда используется JsonUtility.FromJsonOverwrite, новый экземпляр этого объекта, который вы десериализуете, создаваться не будет. Он просто повторно использует переданный вами экземпляр и перезапишет его значения.

Это эффективно, и по возможности его следует использовать.

Player playerInstance;
void Start()
{
    //Must create instance once
    playerInstance = new Player();
    deserialize();
}

void deserialize()
{
    string jsonString = "{\"playerId\":\"8484239823\",\"playerLoc\":\"Powai\",\"playerNick\":\"Random Nick\"}";

    //Overwrite the values in the existing class instance "playerInstance". Less memory Allocation
    JsonUtility.FromJsonOverwrite(jsonString, playerInstance);
    Debug.Log(playerInstance.playerLoc);
}

2. НЕСКОЛЬКО ДАННЫХ (ARRAY JSON)

Ваш Json содержит несколько объектов данных. Например, playerId появлялся более одного раза. JsonUtility Unity не поддерживает массив, поскольку он все еще новый, но вы можете использовать helper от этого человека, чтобы получить массив, работающий с JsonUtility.

Создайте класс с именем JsonHelper. Скопируйте JsonHelper прямо снизу.

public static class JsonHelper
{
    public static T[] FromJson<T>(string json)
    {
        Wrapper<T> wrapper = JsonUtility.FromJson<Wrapper<T>>(json);
        return wrapper.Items;
    }

    public static string ToJson<T>(T[] array)
    {
        Wrapper<T> wrapper = new Wrapper<T>();
        wrapper.Items = array;
        return JsonUtility.ToJson(wrapper);
    }

    public static string ToJson<T>(T[] array, bool prettyPrint)
    {
        Wrapper<T> wrapper = new Wrapper<T>();
        wrapper.Items = array;
        return JsonUtility.ToJson(wrapper, prettyPrint);
    }

    [Serializable]
    private class Wrapper<T>
    {
        public T[] Items;
    }
}

Сериализация массива Json:

Player[] playerInstance = new Player[2];

playerInstance[0] = new Player();
playerInstance[0].playerId = "8484239823";
playerInstance[0].playerLoc = "Powai";
playerInstance[0].playerNick = "Random Nick";

playerInstance[1] = new Player();
playerInstance[1].playerId = "512343283";
playerInstance[1].playerLoc = "User2";
playerInstance[1].playerNick = "Rand Nick 2";

//Convert to JSON
string playerToJson = JsonHelper.ToJson(playerInstance, true);
Debug.Log(playerToJson);

Вывод:

{
    "Items": [
        {
            "playerId": "8484239823",
            "playerLoc": "Powai",
            "playerNick": "Random Nick"
        },
        {
            "playerId": "512343283",
            "playerLoc": "User2",
            "playerNick": "Rand Nick 2"
        }
    ]
}

Десериализация массива Json:

string jsonString = "{\r\n    \"Items\": [\r\n        {\r\n            \"playerId\": \"8484239823\",\r\n            \"playerLoc\": \"Powai\",\r\n            \"playerNick\": \"Random Nick\"\r\n        },\r\n        {\r\n            \"playerId\": \"512343283\",\r\n            \"playerLoc\": \"User2\",\r\n            \"playerNick\": \"Rand Nick 2\"\r\n        }\r\n    ]\r\n}";

Player[] player = JsonHelper.FromJson<Player>(jsonString);
Debug.Log(player[0].playerLoc);
Debug.Log(player[1].playerLoc);

Вывод:

Powai

Пользователь2


Если это массив Json с сервера, и вы не создавали его вручную:

Возможно, вам придется добавить {"Items": перед полученной строкой, а затем добавить } в ее конце.

Я сделал для этого простую функцию:

string fixJson(string value)
{
    value = "{\"Items\":" + value + "}";
    return value;
}

тогда вы можете использовать это:

string jsonString = fixJson(yourJsonFromServer);
Player[] player = JsonHelper.FromJson<Player>(jsonString);

3. десериализация строки json без класса && десериализация Json с числовыми свойствами

Это Json, который начинается с числа или числовых свойств.

Например:

{ 
"USD" : {"15m" : 1740.01, "last" : 1740.01, "buy" : 1740.01, "sell" : 1744.74, "symbol" : "$"}, 

"ISK" : {"15m" : 179479.11, "last" : 179479.11, "buy" : 179479.11, "sell" : 179967, "symbol" : "kr"},

"NZD" : {"15m" : 2522.84, "last" : 2522.84, "buy" : 2522.84, "sell" : 2529.69, "symbol" : "$"}
}

JsonUtility Unity не поддерживает это, потому что свойство «15m» начинается с числа. Переменная класса не может начинаться с целого числа.

Загрузите SimpleJSON.cs из вики Unity.

Чтобы получить недвижимость «15 миллионов долларов»:

var N = JSON.Parse(yourJsonString);
string price = N["USD"]["15m"].Value;
Debug.Log(price);

Чтобы получить собственность "15m" в ISK:

var N = JSON.Parse(yourJsonString);
string price = N["ISK"]["15m"].Value;
Debug.Log(price);

Чтобы получить недвижимость NZD "15m":

var N = JSON.Parse(yourJsonString);
string price = N["NZD"]["15m"].Value;
Debug.Log(price);

Остальные свойства Json, которые не начинаются с числовой цифры, могут обрабатываться Unity JsonUtility.


4.УСТРАНЕНИЕ НЕПОЛАДОК JsonUtility:

Проблемы при сериализации с JsonUtility.ToJson?

Получаете пустую строку или "{}" с JsonUtility.ToJson?

А. Убедитесь, что класс не является массивом. Если это так, используйте указанный выше вспомогательный класс с JsonHelper.ToJson вместо JsonUtility.ToJson.

Б. Добавьте [Serializable] в начало сериализуемого класса.

В. Удалите свойство из класса. Например, в переменной public string playerId { get; set; } удалить { get; set; }. Unity не может сериализовать это.

Проблемы при десериализации с JsonUtility.FromJson?

А. Если вы получили Null, убедитесь, что Json не является массивом Json. Если это так, используйте указанный выше вспомогательный класс с JsonHelper.FromJson вместо JsonUtility.FromJson.

Б. Если при десериализации вы получите NullReferenceException, добавьте [Serializable] в начало класса.

C. При возникновении других проблем убедитесь, что ваш json действителен. Перейдите на этот сайт сюда и вставьте json. Он должен показать вам, действителен ли json. Он также должен сгенерировать правильный класс с Json. Просто не забудьте удалить удалить { get; set; } из каждой переменной, а также добавить [Serializable] в начало каждого сгенерированного класса.


Newtonsoft.Json:

Если по какой-то причине необходимо использовать Newtonsoft.Json, попробуйте разветвленную версию для Unity здесь. Обратите внимание, что при использовании определенной функции может возникнуть сбой. Будь осторожен.


Чтобы ответить на ваш вопрос:

Ваши исходные данные

 [{"playerId":"1","playerLoc":"Powai"},{"playerId":"2","playerLoc":"Andheri"},{"playerId":"3","playerLoc":"Churchgate"}]

Добавьте {"Items": перед, затем добавьте } в конце.

Код для этого:

serviceData = "{\"Items\":" + serviceData + "}";

Теперь у вас есть:

 {"Items":[{"playerId":"1","playerLoc":"Powai"},{"playerId":"2","playerLoc":"Andheri"},{"playerId":"3","playerLoc":"Churchgate"}]}

Чтобы сериализовать несколько данных из php как массивы, теперь вы можете сделать

public player[] playerInstance;
playerInstance = JsonHelper.FromJson<player>(serviceData);

playerInstance[0] - это ваши первые данные

playerInstance[1] - это ваши вторые данные

playerInstance[2] это ваши третьи данные

или данные внутри класса с playerInstance[0].playerLoc, playerInstance[1].playerLoc, playerInstance[2].playerLoc ......

Вы можете использовать playerInstance.Length, чтобы проверить длину, прежде чем обращаться к ней.

ПРИМЕЧАНИЕ. Удалите { get; set; } из класса player. Если у вас { get; set; }, это не сработает. JsonUtility Unity НЕ работает с членами класса, которые определены как свойства.

person Programmer    schedule 27.03.2016
comment
Я возвращаю массив строк запроса mysql из PHP, используя json_encode($row). Таким образом, ответ состоит из нескольких объектов JSONObject в формате [{"playerId":"1","playerLoc":"Powai"},{"playerId":"2","playerLoc":"Andheri"},{"playerId":"3","playerLoc":"Churchgate"}]. Я попробовал JsonUtility, но не смог десериализовать объекты и получить отдельные объекты json. Если вы можете мне с этим помочь. - person dil33pm; 27.03.2016
comment
Посмотрите на код, который я разместил выше. Он показывает вам три способа сделать это с JsonUtility.FromJson. Я забыл сказать вам удалить { get; set; } из класса player. Если у вас { get; set; }, это не сработает. Сравните ваш player класс с тем, что я опубликовал выше, и вы поймете, о чем я говорю. - person Programmer; 27.03.2016
comment
Без проблем. Я отредактирую это, когда Unity добавит поддержку массива (что очень скоро), поэтому вам больше не понадобится этот класс Helper. - person Programmer; 27.03.2016
comment
Прошли месяцы, а очень скоро еще не наступило. Все существующие веб-технологии используют JSON, а у нас его до сих пор нет ... - person Vlady Veselinov; 29.11.2016
comment
Я бы не стал говорить: «Забудьте обо всех сторонних библиотеках». У JsonUtility есть ограничения. Он не возвращает объект JSON, с которым вы можете выполнять действия. Например, я получаю файл json и хочу проверить, доступен ли ключ успеха. Не могу. JsonUtility требует, чтобы потребитель знал точное содержимое файла json. Также нет конвертера словарей. Так что он делает некоторые хорошие вещи, но по-прежнему требуется использование сторонних разработчиков. - person Everts; 03.02.2017
comment
@ Я знаю. Это легкий сериализатор. Он работает для 90 процентов вопросов, задаваемых о json на этом сайте. По этому вопросу он тоже должен работать. Я изменил вопрос, чтобы добавить его вверху. - person Programmer; 03.02.2017
comment
Привет, @Programmer, во-первых, отличный пост, я уже около 3 часов искал / кодировал метод чтения массива Json. Я новичок в Unity, и, исходя из опыта работы в сети, мне кажется таким естественным хранить игровые данные в формате JSON ... немного разочарован тем, что Unity не имеет лучшей готовой системы чтения / записи JSON. Итак, из двух вариантов: сломать шаблон и создать отдельный файл JSON для каждого оружия в игре + один файл json для хранения всех ссылок ИЛИ взломать json, читая его с помощью некоторого дополнительного кода (JsonHelper) для чтения массивов, что бы вы скажи лучше? - person sigmawf; 08.03.2017
comment
Используйте 1_. Все нормально. Если вы создаете с ним Json, вы также можете читать с ним json без дополнительных действий. Единственный раз, когда вам может потребоваться дополнительная работа, - это если вы получаете массив json с сервера, и это включено в решение, в моем ответе. Другой способ без JsonHelper - поместить класс в другой класс, а затем сделать его List. Это работает для большинства людей. Если вы ищете способ сохранить и загрузить данные игры, см. это. Вы загружаете и сохраняете с помощью одной строчки кода. - person Programmer; 08.03.2017
comment
Другой способ без JsonHelper - поместить класс в другой класс, а затем сделать его списком. Это работает для большинства людей. - Как это сработает? Возможно, это именно то, что я ищу. - person sigmawf; 09.03.2017
comment
Напротив, я рекомендую использовать стороннюю гибкую библиотеку: настраиваемая сериализация / десериализация, сериализация свойств, сопоставление полей объекта с полями Json, игнорирование полей, использование конструкторов и т. Д. Проще говоря, он не поддерживает стандартное соглашение JSON (например, .массивы верхнего уровня). Да, JsonUtility самый быстрый, но Json-сериализация обычно происходит во время асинхронных операций или служит для сохранить какие-то данные, и в такие моменты несколько десятков миллисекунд не играют большой роли. - person Ruslan L.; 13.05.2017
comment
Мой веб-сервер возвращает массив массива объектов, каждый объект похож на {"c":"xx", "d":"yy"}. Вы привели много примеров, но не массив массивов ... Могу я попросить вас привести один? Я хотел бы узнать, как создать рабочий цикл с этим SimpleJSON.JSONNode a = SimpleJSON.JSON.Parse("[[{\"c\": 1, \"d\": 1},{\"c\": 1, \"d\": 1}]]"); Мои циклы начинаются так, и все в порядке, но я не могу получить доступ к свойствам c и d каждого объекта: foreach (SimpleJSON.JSONNode row in a) { foreach (SimpleJSON.JSONNode cell in row) { var j = cell.AsObject; Debug.Log(j['c']); } } - person Olivier Pons; 22.12.2017
comment
Вы используете SimpleJSON только в том случае, если JsonUtility Unity не может его сериализовать. Что именно вы получаете с сервера? Просто опубликуйте как есть, и я вам помогу - person Programmer; 22.12.2017
comment
На всякий случай вы хотите сериализовать в том же формате JSON [{...},{...}], но получаете {"objectName": [{...},{...}] }}. Помните, что вы можете вырезать строку с помощью двух простых строк кода на C #, например: String result = JsonUtility.ToJson(list); result = result.Substring(result.IndexOf("[")); //Remove everything before [ result = result.Substring(0, result.LastIndexOf("]") + 1); //Remove everything after ] - person Lotan; 31.03.2018
comment
Спасибо за ссылку на SimpleJSON. Это действительно спасло мне день. - person Akhil Gupta; 24.01.2019
comment
JsonHelper у меня не работал. Вероятно, потому что я пытался сериализовать массив структуры, а не класса. Я изменил его, чтобы сериализовать каждый элемент по отдельности и соединить их, заключив их в квадратные скобки. - person Akhil Gupta; 06.02.2019
comment
вы заслуживаете монетку или что-то такое за это. потрясающий ответ! - person tatmanblue; 06.08.2020
comment
Хоува, прокомментируйте, je t'aime toi! - person Yann; 11.05.2021
comment
Обратите внимание, что в новой версии Newtonsoft JSON частично встроен как Пакет через диспетчер пакетов! Он намного мощнее и, например, поддерживает: свойства, словари, вложенные массивы и т. д. - person derHugo; 16.05.2021
comment
Извините, но JsonUtility недостаточно надежен для сложных сценариев. - person jhchnc; 06.06.2021

Предположим, у вас есть такой JSON

[
    {
        "type": "qrcode",
        "symbol": [
            {
                "seq": 0,
                "data": "HelloWorld9887725216",
                "error": null
            }
        ]
    }
]

Чтобы проанализировать вышеуказанный JSON в единстве, вы можете создать такую ​​модель JSON.

[System.Serializable]
public class QrCodeResult
{
    public QRCodeData[] result;
}

[System.Serializable]
public class Symbol
{
    public int seq;
    public string data;
    public string error;
}

[System.Serializable]
public class QRCodeData
{
    public string type;
    public Symbol[] symbol;
}

А затем просто проанализируйте следующим образом ...

var myObject = JsonUtility.FromJson<QrCodeResult>("{\"result\":" + jsonString.ToString() + "}");

Теперь вы можете изменить JSON / CODE в соответствии с вашими потребностями. https://docs.unity3d.com/Manual/JSONSerialization.html

person Narottam Goyal    schedule 25.09.2017
comment
На самом деле это работает довольно хорошо, если он работает с таким классом, как Symbol, который также не является массивом. - person Gennon; 14.05.2018
comment
Я пытаюсь сделать это с помощью unity 2018, но это не работает: массивы не анализируются - person Jean-Michaël Celerier; 06.10.2018
comment
Используется в Unity 2018 и 2019. Отлично работает. Доступ к данным массива, например: Debug.Log(myObject.result[0].symbol[0].data);, for(var i = 0; i <= myObject.result.Length - 1; i ++) { Debug.Log(myObject.result[i].type); } или foreach (var item in myObject.result) { Debug.Log(item.type); } - person Towerss; 29.04.2019
comment
@Narottam Goyal, ваш метод в некоторых случаях не работает, также это очень сложное решение для новичков, обратитесь к этому ответу от меня в этой теме ссылка - person Juned Khan Momin; 15.05.2019
comment
@JunedKhanMomin, ваш ответ в основном такой же, но без учета того факта, что этот вопрос здесь касался, в частности, массива корневого уровня в данных JSON. В общем, вам лучше обратиться к ответу программиста, который является более подробным. - person derHugo; 07.06.2019

вам нужно добавить [System.Serializable] в класс PlayerItem, например:

using System;
[System.Serializable]
public class PlayerItem   {
    public string playerId;
    public string playerLoc;
    public string playerNick;
}
person Myan    schedule 05.12.2016

Единство ‹= 2019

У Нароттама Гояла была хорошая идея обернуть массив в объект json, а затем десериализовать его в структуру. Следующее использует Generics для решения этой проблемы для массивов всех типов, в отличие от создания нового класса каждый раз.

[System.Serializable]
private struct JsonArrayWrapper<T> {
    public T wrap_result;
}

public static T ParseJsonArray<T>(string json) {
    var temp = JsonUtility.FromJson<JsonArrayWrapper<T>>("{\"wrap_result\":" + json + "}");
    return temp.wrap_result;
}

Его можно использовать следующим образом:

string[] options = ParseJsonArray<string[]>(someArrayOfStringsJson);

Единство 2020

В Unity 2020 есть официальный newtonsoft, который является намного лучшей библиотекой json.

person Justin Meiners    schedule 26.06.2020
comment
Ссылка, которую вы предоставили, мертва, но эта ссылка указана как соответствующая статья: docs.unity3d.com/Packages/[email protected]/ с примечанием: это пакет, предназначенный для внутренних проектов разработки Unity и как таковой этот пакет не поддерживается. Используйте на свой риск. - person R2RT; 17.09.2020
comment
Это первое решение все еще работает? Все, что я получаю, - это нулевое значение для wrap_result. - person david.pfx; 06.04.2021
comment
@ david.pfx исправлена ​​опечатка, как насчет сейчас? - person Justin Meiners; 09.04.2021
comment
Извините, не могу протестировать, перешел на Newtonsoft, чтобы все двигалось. Но я попробую еще раз, когда у меня будет время - я действительно не хочу добавлять ненужную зависимость. - person david.pfx; 10.04.2021

Чтобы прочитать файл JSON, обратитесь к этому простому примеру

Ваш файл JSON (StreamingAssets / Player.json)

{
    "Name": "MyName",
    "Level": 4
}

C # скрипт

public class Demo
{
    public void ReadJSON()
    {
        string path = Application.streamingAssetsPath + "/Player.json";
        string JSONString = File.ReadAllText(path);
        Player player = JsonUtility.FromJson<Player>(JSONString);
        Debug.Log(player.Name);
    }
}

[System.Serializable]
public class Player
{
    public string Name;
    public int Level;
}
person Juned Khan Momin    schedule 15.05.2019
comment
А как насчет массивов? И что добавляет этот ответ, чего еще не было в принятом ответе более трех лет назад? - person derHugo; 01.07.2019
comment
@derHugo он включает вызов File.ReadAllText, который, на мой взгляд, полезен, и ни в одном другом ответе не упоминается :) - person Ruzihm; 24.09.2020
comment
@Ruzihm, причина, по которой не упоминается ни один другой ответ, заключается в том, что область действия этого вопроса заключается в том, как (де) сериализовать ... а не как сделать FileIO;) - person derHugo; 24.09.2020

Не обрезайте [], и все будет в порядке. [] идентифицируйте массив JSON, который является именно тем, что вам нужно, чтобы иметь возможность перебирать его элементы.

person Thomas Hilbert    schedule 26.03.2016

Как сказал @Maximiliangerhardt, MiniJson не имеет возможности правильно десериализоваться. Я использовал JsonFx и работает как шарм. Работает с []

player[] p = JsonReader.Deserialize<player[]>(serviceData);
Debug.Log(p[0].playerId +" "+ p[0].playerLoc+"--"+ p[1].playerId + " " + p[1].playerLoc+"--"+ p[2].playerId + " " + p[2].playerLoc);
person dil33pm    schedule 27.03.2016

Вы можете использовать Newtonsoft.Json, просто добавьте Newtonsoft.dll в свой проект и используйте скрипт ниже

using System;
using Newtonsoft.Json;
using UnityEngine;

public class NewBehaviourScript : MonoBehaviour
{

    [Serializable]
    public class Person
    {
        public string id;
        public string name;
    }
    public Person[] person;

    private void Start()
    {
       var myjson = JsonConvert.SerializeObject(person);

        print(myjson);

    }
}

введите описание изображения здесь

другое решение - использование JsonHelper

using System;
using Newtonsoft.Json;
using UnityEngine;

public class NewBehaviourScript : MonoBehaviour
{

    [Serializable]
    public class Person
    {
        public string id;
        public string name;
    }
    public Person[] person;

    private void Start()
    {
        var myjson = JsonHelper.ToJson(person);

        print(myjson);

    }
}

введите описание изображения здесь

person Seyed Morteza Kamali    schedule 13.10.2019
comment
Обратите внимание, что newtonsoft, похоже, не работает в единстве, например, при сборке на Android. Однако он будет работать в редакторе единства. В этом случае рекомендуется использовать вилку newtonsoft для единства stackoverflow.com/questions/59194154/ - person Rose; 22.11.2020

ЕСЛИ вы используете Vector3, это то, что я сделал

1- Я создаю класс, назовите его Player

using System;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
[Serializable]
public class Player
{
    public Vector3[] Position;

}

2- тогда я называю это так

if ( _ispressed == true)
        {
            Player playerInstance = new Player();
            playerInstance.Position = newPos;
            string jsonData = JsonUtility.ToJson(playerInstance);

            reference.Child("Position" + Random.Range(0, 1000000)).SetRawJsonValueAsync(jsonData);
            Debug.Log(jsonData);
            _ispressed = false;
        }

3- и вот результат

"Позиция": [{"x": - 2,8567452430725099, «y»: - 2,4323320388793947, «z»: 0,0}]}

person Gara    schedule 02.01.2020