Может ли JsonUtility.FromJson десериализовать вложенные значения? - PullRequest
0 голосов
/ 11 марта 2019

Я пытаюсь десериализовать объект 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 Ответ

2 голосов
/ 11 марта 2019

Первое утверждение для

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

на самом деле работает для меня, как и ожидалось.


Из порядка полей вашего класса я бы ожидал, что reserialized скорее будет иметь значение

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

так как он идет сверху вниз. Это, очевидно, не совсем совпадает с данной строкой json, хотя она имеет в основном то же содержание.

Итак,

Assert.AreEqual(reserialized, json); 

всегда будет неудачным, если ваш исходный ввод json не имеет точно совпадающего порядка

JsonUtility.ToJson(deserialized);

Кстати, это именно то, о чем уже говорит результат:

SerializationSimplePasses (0,027 с)
---
Длина строк - 46. Строки различаются по индексу 2.
Ожидаемый: "{"rootStr":"rootStrValue","foo":{"bar":"baz"}}"
Но было: "{"foo":{"bar":"baz"},"rootStr":"rootStrValue"}"
------------- ^
---
в Tests.Serialization.SerializationSimplePasses () [0x0003c] в E: ... \ Assets \ Tests \ NewTestScript.cs: 31

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...