是否可以在Unity中反序列化字典?

时间:2016-08-16 18:45:47

标签: c# json unity3d deserialization

使用看起来像这样的JSON文件,

{ 
"dict": {"key": "value"} 
}

如何在Unity中创建一个名为“dict”的字典,看起来像这个{“key”:“value”}?

这是我的班级。

[Serializable]
public class MyJson
{
    public Dictionary<string,string> dict;
}

我不知道为什么但是当我尝试使用这个类和JsonUnility.FromJson()方法时,它似乎没有将dict更改为我期望的字典。相反,它只是空。

编辑:我已经看到在Unity文档中它说“字典不受支持”所以有一些方便的方法来轻松创建字典或者我必须将它拼凑在一起数据?

这是一个潜在的JSON。这种问题进入了我遇到的另一个问题,虽然我用python创建了JSON,这意味着我可以在我的字典中使用不同的值类型,但这对C#不起作用所以现在它只是字符串而且我会稍后想出一些东西。 (可能通过制作所有列表然后只有字符串的那些将只有1个元素)

{
    "pages": [
    {
        "files": "[null, null, null, null]", 
        "imagepath": "C:/Users/Jeff/Pictures/location_sharing.png", 
        "pageNum": "0", 
        "polygons": "[[[122, 184], [178, 180], [174, 159], [126, 158]], [[191, 157], [194, 185], [241, 183], [246, 154]], [[334, 219], [323, 236], [323, 247], [338, 259], [358, 259], [364, 236], [356, 221], [344, 215]], [[512, 221], [503, 235], [508, 256], [518, 267], [538, 260], [548, 250], [541, 228], [529, 218]]]"
    }, 
    {
        "files": "[null, null, null]", 
        "imagepath": "C:/Users/Jeff/Pictures/node.png", 
        "pageNum": "1", 
        "polygons": "[[[189, 149], [181, 152], [188, 170], [197, 182], [196, 173], [192, 153]], [[233, 176], [258, 171], [244, 144]], [[116, 260], [143, 227], [181, 210], [225, 202], [276, 199], [305, 210], [353, 222], [360, 252], [361, 266]]]"
    }]}

2 个答案:

答案 0 :(得分:5)

您更新的示例架构看起来根本不是字典。因为pages中的每个元素都不是实际嵌套的json,而是一个看起来像是嵌套json的字符串,所有你需要做的就是

[Serializable]
public class PageContainer
{
    Page[] pages;
}

[Serializable]
public class Page
{
    public string files;
    public string imagepath;
    public string pagenum;
    public string polygons;
}

然后做一个

PageContainer pageContainer = JsonUtility.FromJson<PageContainer>(yourString);

然后你可能需要做进一步的

FileContainer fileContainer = JsonUtility.FromJson<FileContainer>(pageContainer.files);
PolygonContainer polygonContainer = JsonUtility.FromJson<PolygonContainer>(pageContainer.polygons);

并根据需要制作必要的课程。

答案 1 :(得分:0)

我会创建一个存储的模型。我将其称为KeyValue,因为我不确定您实际存储的是什么。然后我会给你那个模型你指定的两个字符串属性。一个名为key的字符串属性,另一个名为value的字符串属性。

Dictionary<KeyValue> keyValues = new Dictionary<KeyValue>();
    //of course here instead of hard coding I would pass values in from where ever you are getting them.
    KeyValue kv1 = new KeyValue("myKey1", "myValue1");
    KeyValue kv2 = new KeyValue("myKey2", "myValue2");

    keyValues.Add(kv1);
    keyValues.Add(kv2);

所以这应该给你一个很好的跳跃点,假设我理解你的问题是正确的,但一般的想法是创建一个你需要的类型的字典然后填充该字典。