JsonUtility.FromJson可以反序列化嵌套值吗?

时间:2019-03-11 00:58:24

标签: c# json unity3d

我正在尝试使用深度嵌套的值反序列化JSON对象,但是所有尝试都是空的。以下是测试失败,但我希望通过的测试。有人可以解释我所缺少的吗?

using System.Collections.Generic;
using NUnit.Framework;
using UnityEngine;
using UnityEngine.TestTools;

[System.Serializable]
class TestJson
{
  public string rootStr;
  public Foo foo;
}

[System.Serializable]
class Foo
{
  public string bar;
}

namespace Tests
{
  public class Serialization
  {
    [Test]
    public void SerializationSimplePasses()
    {
      string json = "{\"foo\":{\"bar\":\"baz\"},\"rootStr\":\"rootStrValue\"}";
      var deserialized = JsonUtility.FromJson<TestJson>(json);
      Assert.AreEqual(deserialized.rootStr, "rootStrValue"); // this works
      Assert.AreEqual(deserialized.foo.bar, "baz"); // this fails
      var reserialized = JsonUtility.ToJson(deserialized);
      Assert.AreEqual(reserialized, json); // this fails
    }

  }
}

1 个答案:

答案 0 :(得分:2)

第一个断言

Assert.AreEqual(deserialized.foo.bar, "baz");

实际上对我有用。


根据您班级中各个字段的顺序,我希望reserialized会更有价值

"{\"rootStr\":\"rootStrValue\", \"foo\":{\"bar\":\"baz\"}}";

,因为它从上到下。尽管它的内容基本相同,但显然不完全等于给定的字符串json

所以

Assert.AreEqual(reserialized, json); 
只要原始输入json的顺序不完全匹配

将始终失败

JsonUtility.ToJson(deserialized);

这恰好也是输出已经告诉您的内容:

  

SerializationSimplePasses(0,027s)
  ---
  字符串长度均为46。字符串在索引2处不同。
  预期:"{"rootStr":"rootStrValue","foo":{"bar":"baz"}}"
  但是是:"{"foo":{"bar":"baz"},"rootStr":"rootStrValue"}"
  ------------- ^
  ---
  在E:... \ Assets \ Tests \ NewTestScript.cs中的Tests.Serialization.SerializationSimplePasses()[0x0003c]: 31