JsonConvert проблема десеарилизации Unity C# vs Android

Программирование на Юнити.

JsonConvert проблема десеарилизации Unity C# vs Android

Сообщение vedmed2005 18 янв 2019, 19:44

проблема чтения и десеарилизации
txtDebug - компонент Text на канвасе - что то типо консоли
Синтаксис:
Используется csharp
using Newtonsoft.Json;
using System.Collections.Generic;
using System.IO;
using UnityEngine;
using UnityEngine.UI;
 
public class IOFilesController : MonoBehaviour
{
       
    public static Dictionary<string, string> GetDictionaryFromFile(string culture)
    {
        Dictionary<string, string> CurrentCultureDictionary = new Dictionary<string, string>();
       
        Text txtDebug = GameObject.Find("MainCanvas").GetComponentInChildren<Text>();
        txtDebug.text += "before string readstring \r\n";
#if UNITY_EDITOR
        string readstring = File.ReadAllText(Application.dataPath + "/Resources/Files/DictionaryLocalisation." + culture);
        txtDebug.text += "after unity string readstring = File.ReadAllText \r\n";
#elif UNITY_ANDROID
        WWW reader = new WWW(Application.dataPath + "/Resources/Files/DictionaryLocalisation." + culture);
        txtDebug.text += "after WWW reader = new WWW  \r\n";  - это выводит
        while (!reader.isDone) { }
        txtDebug.text += "after while (!reader.isDone) \r\n";           - это выводит
        string readstring = reader.text;
        txtDebug.text += "after string readstring = reader.text; \r\n";- это выводит
        txtDebug.text += readstring;
        txtDebug.text += "after txtDebug.text +=readstring;"              - не выводит!
#endif
 
 
        txtDebug.text += "after #endif  \r\n";
        txtDebug.text += readstring;
       
        CurrentCultureDictionary = JsonConvert.DeserializeObject<Dictionary<string, string>>(readstring);
        txtDebug.text += "after CurrentCultureDictionary = JsonConvert \r\n";
        Debug.Log("Загружен словарь : " + Application.dataPath + "/Resources/Files/DictionaryLocalisation." + culture);
        txtDebug.text += "Загружен словарь : " + Application.dataPath + "/Resources/Files/DictionaryLocalisation." + culture;
        return CurrentCultureDictionary;
    }
}
 


в юнити все без проблем - проходит весь код.
в андроиде что то никак неполучается, 4 часа долблюсь никак непойму

признаки:
андроид тонет уже на строке txtDebug.text += readstring; (тонет - это не значит -вылетает )
txtDebug.text += "after string readstring = reader.text; \r\n"; - это еще печатает(строка выше)

прошу совета
vedmed2005
UNец
 
Сообщения: 41
Зарегистрирован: 31 дек 2018, 08:06

Re: JsonConvert проблема десеарилизации Unity C# vs Android

Сообщение Anonymyx 18 янв 2019, 22:02

Папки Resources в билде не существует. Вместо прямого чтения из пути используется https://docs.unity3d.com/ScriptReferenc ... .Load.html
Аватара пользователя
Anonymyx
Адепт
 
Сообщения: 1973
Зарегистрирован: 05 апр 2015, 15:55

Re: JsonConvert проблема десеарилизации Unity C# vs Android

Сообщение vedmed2005 19 янв 2019, 08:15

ага спасибо, уже нашел )
vedmed2005
UNец
 
Сообщения: 41
Зарегистрирован: 31 дек 2018, 08:06

Re: JsonConvert проблема десеарилизации Unity C# vs Android

Сообщение vedmed2005 19 янв 2019, 17:21

работает
Синтаксис:
Используется csharp
TextAsset readstringdata = (TextAsset)Resources.Load("Files/DictionaryLocalisation." + culture, typeof(TextAsset));
        string readstring = Encoding.UTF8.GetString(readstringdata.bytes);
 

readstring; - на андроиде выводит нормальную строку формата json
теперь завис на этом - опять же не пашет на андроиде(юнити работает)
Синтаксис:
Используется csharp
Dictionary<string, string> CurrentCultureDictionary = JsonConvert.DeserializeObject<Dictionary<string, string>>(readstring);
 


логи андроида пока к сожалению читать не умею
vedmed2005
UNец
 
Сообщения: 41
Зарегистрирован: 31 дек 2018, 08:06

Re: JsonConvert проблема десеарилизации Unity C# vs Android

Сообщение vedmed2005 19 янв 2019, 17:48

Синтаксис:
Используется csharp
JObject jsonObj = JObject.Parse(readstring);
        CurrentCultureDictionary = jsonObj.ToObject<Dictionary<string, string>>();


и так тоже не работает на андроиде
vedmed2005
UNец
 
Сообщения: 41
Зарегистрирован: 31 дек 2018, 08:06

Re: JsonConvert проблема десеарилизации Unity C# vs Android

Сообщение vedmed2005 19 янв 2019, 17:57

полный код на всякий
Синтаксис:
Используется csharp
public static Dictionary<string, string> GetDictionaryFromFile(string culture)
    {
        Dictionary<string, string> CurrentCultureDictionary = new Dictionary<string, string>();
       
        Text txtDebug = GameObject.Find("MainCanvas").GetComponentInChildren<Text>();
        TextAsset readstringdata = (TextAsset)Resources.Load("Files/DictionaryLocalisation." + culture, typeof(TextAsset));
        string readstring = Encoding.UTF8.GetString(readstringdata.bytes);
        txtDebug.text += readstring; - вот на этом все заканчивается на андроиде, readstring выводит и всё!!!      
       
        JObject jsonObj = JObject.Parse(readstring);
тут тоже txtDebug.text += .... - это уже не выводится
        CurrentCultureDictionary = jsonObj.ToObject<Dictionary<string, string>>();
       
        return CurrentCultureDictionary;
    }
 
vedmed2005
UNец
 
Сообщения: 41
Зарегистрирован: 31 дек 2018, 08:06

Re: JsonConvert проблема десеарилизации Unity C# vs Android

Сообщение Anonymyx 19 янв 2019, 19:08

Попробуйте обернуть свой словарь в класс:
[System.Serializable]
class Wrapper
{
public Dictionary...
}

И уже сериализовывать и десериализовывать этот объект.
Аватара пользователя
Anonymyx
Адепт
 
Сообщения: 1973
Зарегистрирован: 05 апр 2015, 15:55

Re: JsonConvert проблема десеарилизации Unity C# vs Android

Сообщение vedmed2005 19 янв 2019, 20:40

это конечно спасибо, но тут дело как я понял не в том чтобы словарь не воспринимал то что идет от JSON, а в том что json в андроиде не передает словарю то что надо
vedmed2005
UNец
 
Сообщения: 41
Зарегистрирован: 31 дек 2018, 08:06

Re: JsonConvert проблема десеарилизации Unity C# vs Android

Сообщение vedmed2005 19 янв 2019, 20:41

чего его заворачивать , если в юнити CurrentCultureDictionary = JsonConvert.DeserializeObject<Dictionary<string, string>>(readstring); работает
vedmed2005
UNец
 
Сообщения: 41
Зарегистрирован: 31 дек 2018, 08:06

Re: JsonConvert проблема десеарилизации Unity C# vs Android

Сообщение vedmed2005 19 янв 2019, 20:42

CurrentCultureDictionary =JsonUtility.FromJson<Dictionary<string, string>>(readstring);в андроиде не передает
Последний раз редактировалось vedmed2005 19 янв 2019, 20:44, всего редактировалось 2 раз(а).
vedmed2005
UNец
 
Сообщения: 41
Зарегистрирован: 31 дек 2018, 08:06

Re: JsonConvert проблема десеарилизации Unity C# vs Android

Сообщение vedmed2005 19 янв 2019, 20:43

Синтаксис:
Используется csharp
JObject jsonObj = JObject.Parse(readstring);
CurrentCultureDictionary = jsonObj.ToObject<Dictionary<string, string>>();

тоже не пашет на андроиде
vedmed2005
UNец
 
Сообщения: 41
Зарегистрирован: 31 дек 2018, 08:06

Re: JsonConvert проблема десеарилизации Unity C# vs Android

Сообщение vedmed2005 20 янв 2019, 11:49

надоело все, написал свой
Синтаксис:
Используется csharp
public Dictionary<K, V> DeserelizationDictionaryJson<K,V>(Dictionary<K,V> dict,TextAsset txtFile)
    {
        K myKey;
        V myValue;
 
        string txtFromFile = txtFile.text;
        txtFromFile = txtFromFile.Substring(1, txtFromFile.Length-2);
        string[] txtKeyValuePairs = txtFromFile.Split(new char[] {','});
        string[] txtPair = new string[2];
        dict.Clear();
        foreach (string pairs in txtKeyValuePairs)
        {
            txtPair = pairs.Split(new char[] { ':' });  
           
            string str = txtPair[0].Substring(1, txtPair[0].Length - 2);
            myKey = (K)Convert.ChangeType(str, typeof(K));
 
            str = txtPair[1].Substring(1, txtPair[1].Length - 2);
            myValue = (V)Convert.ChangeType(str, typeof(V));
            dict.Add(myKey, myValue);
        }
        return dict;
    }
 


с int и string полями работает нормально, с остальными типами не пробовал
vedmed2005
UNец
 
Сообщения: 41
Зарегистрирован: 31 дек 2018, 08:06

Re: JsonConvert проблема десеарилизации Unity C# vs Android

Сообщение vedmed2005 20 янв 2019, 13:11

небольшая поправка (не учитывались ":" и запятые, выдавало ошибку) если кому полезно

Синтаксис:
Используется csharp
using System;
using System.Collections.Generic;
using UnityEngine;

public class IOFilesController : MonoBehaviour
{
   
    public static Dictionary<string, string> GetDictionaryFromFile(string culture)
    {
       
    Dictionary<string, string> CurrentCultureDictionary = new Dictionary<string, string>();
        TextAsset readstringdata = (TextAsset)Resources.Load("Files/DictionaryLocalisation." + culture, typeof(TextAsset));
        CurrentCultureDictionary = DeserelizationDictionaryJson(CurrentCultureDictionary, readstringdata);        
        return CurrentCultureDictionary;
    }
    //dictionary deserializatiion from json format
    public static  Dictionary<K, V> DeserelizationDictionaryJson<K, V>(Dictionary<K, V> dict, TextAsset txtFile)
    {
        K myKey;
        V myValue;

        string txtFromFile = txtFile.text;
        txtFromFile = txtFromFile.Substring(2, txtFromFile.Length - 4);        
        string[] txtKeyValuePairs = txtFromFile.Split(new string[] {"\",\"" }, StringSplitOptions.RemoveEmptyEntries);
        string[] txtPair = new string[2];
        dict.Clear();
        string str;
        foreach (string pairs in txtKeyValuePairs)
        {
            txtPair = pairs.Split(new string[] { "\":\"" }, StringSplitOptions.RemoveEmptyEntries);
           
            str = txtPair[0];
            myKey = (K)Convert.ChangeType(str, typeof(K));

            str = txtPair[1];
            myValue = (V)Convert.ChangeType(str, typeof(V));
            dict.Add(myKey, myValue);
        }
        return dict;
    }
}
 
vedmed2005
UNец
 
Сообщения: 41
Зарегистрирован: 31 дек 2018, 08:06


Вернуться в Скрипты

Кто сейчас на конференции

Сейчас этот форум просматривают: Yandex [Bot] и гости: 16