【问题标题】:Deserialize a dictionary with JsonFX使用 JsonFX 反序列化字典
【发布时间】:2014-02-01 07:00:45
【问题描述】:

我正在尝试序列化Dictionary<string, object> 类型的字典以存储一系列参数。字典包含原始变量类型和复杂变量类型(例如列表)。序列化按预期工作,但是当将 JSON 字符串反序列化回Dictionary<string, object> 时,List<T> 类型的那些参数将转换为Dictionary<string, object> 类型。当我尝试输入这些参数时,我得到一个InvalidCastException

using UnityEngine;
using System.Collections;
using System.Collections.Generic;
using JsonFx.Json;

public class LevelBuilderStub : MonoBehaviour
{
    class Person
    {
        public string name;
        public string surname;
    }

    // Use this for initialization
    void Start ()
    {
        Dictionary<string, object> parameters = new Dictionary<string, object>();
        List<Person> persons = new List<Person>();
        persons.Add(new Person() { name = "Clayton", surname = "Curmi" });
        persons.Add(new Person() { name = "Karen", surname = "Attard" });

        parameters.Add("parameterOne", 3f);
        parameters.Add("parameterTwo", "Parameter string info");
        parameters.Add("parameterThree", persons.ToArray());

        string json = JsonWriter.Serialize(parameters);
        AVDebug.Log(json);

        parameters = null;
        parameters = JsonReader.Deserialize(json, typeof(Dictionary<string, object>)) as Dictionary<string, object>;

        foreach(KeyValuePair<string, object> kvp in parameters)
        {
            string key = kvp.Key;
            object val = kvp.Value;
            AVDebug.Log(string.Format("Key : {0}, Value : {1}, Type : {2}", key, val, val.GetType()));
        }
    }
}

这将返回以下内容;

{"parameterOne":3,"parameterTwo":"Parameter string info","parameterThree":[{"name":"Clayton","surname":"Curmi"},{"name":"Karen","surname":"Attard"}]}
Key : parameterOne, Value : 3, Type : System.Int32
Key : parameterTwo, Value : Parameter string info, Type : System.String
Key : parameterThree, Value : System.Collections.Generic.Dictionary`2[System.String,System.Object][], Type : System.Collections.Generic.Dictionary`2[System.String,System.Object][]

问题是,我怎样才能获得参数键“parameterThree”的List&lt;Person&gt;。请注意,参数字典的内容会根据其上下文而有所不同。

【问题讨论】:

标签: c# json serialization unity3d


【解决方案1】:

找到了解决方案!必须使用 JsonName 属性标记正在序列化的类,然后使用写入器/读取器设置在 JSON 输出中包含变量的程序集名称。以前面的例子为例,这是你必须做的;

using UnityEngine;
using System;
using System.Collections;
using System.Collections.Generic;
using System.Text;
using JsonFx.Json;

[Serializable]
[JsonName("Person")]
public class Person
{
    public string name;
    public string surname;
}

[JsonName("Animal")]
public class Animal
{
    public string name;
    public string species;
}

[Serializable]
public class Parameters
{
    public float floatValue;
    public string stringValue;
    public List<Person> listValue;
}

public class SerializationTest : MonoBehaviour
{
    // Use this for initialization
    void Start()
    {
        ScenarioOne();
    }

    void ScenarioOne()
    {
        Dictionary<string, object> parameters = new Dictionary<string, object>();
        List<Person> persons = new List<Person>();
        persons.Add(new Person() { name = "Clayton", surname = "Curmi" });
        persons.Add(new Person() { name = "Karen", surname = "Attard" });

        List<Animal> animals = new List<Animal>();
        animals.Add(new Animal() { name = "Chimpanzee", species = "Pan troglodytes" });
        animals.Add(new Animal() { name = "Cat", species = "Felis catus" });

        parameters.Add("floatValue", 3f);
        parameters.Add("stringValue", "Parameter string info");
        parameters.Add("persons", persons.ToArray());
        parameters.Add("animals", animals.ToArray());

        // ---- SERIALIZATION ----

        JsonWriterSettings writerSettings = new JsonWriterSettings();
        writerSettings.TypeHintName = "__type";

        StringBuilder json = new StringBuilder();
        JsonWriter writer = new JsonWriter(json, writerSettings);
        writer.Write(parameters);

        AVDebug.Log(json.ToString());

        // ---- DESERIALIZATION ----

        JsonReaderSettings readerSettings = new JsonReaderSettings();
        readerSettings.TypeHintName = "__type";

        JsonReader reader = new JsonReader(json.ToString(), readerSettings);

        parameters = null;
        parameters = (Dictionary<string, object>)reader.Deserialize();

        foreach (KeyValuePair<string, object> kvp in parameters)
        {
            string key = kvp.Key;
            object val = kvp.Value;
            AVDebug.Log(val == null);
            AVDebug.Log(string.Format("Key : {0}, Value : {1}, Type : {2}", key, val, val.GetType()));
        }
    }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-03-06
    • 2016-05-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多