我正在尝试使用深度嵌套的值反序列化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
}
}
}
答案 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