Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/327.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 使用统一';s JsonUtility.FromJson以反序列化嵌套的JSON_C#_Unity3d - Fatal编程技术网

C# 使用统一';s JsonUtility.FromJson以反序列化嵌套的JSON

C# 使用统一';s JsonUtility.FromJson以反序列化嵌套的JSON,c#,unity3d,C#,Unity3d,我编写了两个测试,分别尝试反序列化成功和失败的平面对象和嵌套对象,如下所示: using NUnit.Framework; using UnityEngine; namespace Tests { public class FromJson { [Test] public void Flat() { string json = "{\"data\":\"foo\"}"; Flat deserialized = JsonUtility.Fr

我编写了两个测试,分别尝试反序列化成功和失败的平面对象和嵌套对象,如下所示:

using NUnit.Framework;
using UnityEngine;

namespace Tests
{
  public class FromJson
  {
    [Test]
    public void Flat()
    {
      string json = "{\"data\":\"foo\"}";
      Flat deserialized = JsonUtility.FromJson<Flat>(json);
      Assert.AreEqual(deserialized.data, "foo");
      var reserialized = JsonUtility.ToJson(deserialized);
      Assert.AreEqual(json, reserialized);
    }

    [Test]
    public void Nested() 
    {
      string json = "{\"data\":{\"data\":\"foo\"}}";
      Nested deserialized = JsonUtility.FromJson<Nested>(json);
      Assert.AreEqual(deserialized.data.data, "foo");
      var reserialized = JsonUtility.ToJson(deserialized);
      Assert.AreEqual(json, reserialized);
    }

  }
}

public class Flat
{
  public string data;
}

public class Nested
{
  public Data data;
}

public class Data
{
  public string data;
}
使用NUnit.Framework;
使用UnityEngine;
命名空间测试
{
来自JSON的公共类
{
[测试]
公屋单位(
{
字符串json=“{\'data\”:\'foo\“}”;
平面反序列化=JsonUtility.FromJson(json);
AreEqual(反序列化的.data,“foo”);
var reserialized=JsonUtility.ToJson(反序列化);
AreEqual(json,重新序列化);
}
[测试]
公共空嵌套()
{
字符串json=“{\'data\':{\'data\':\'foo\'}”;
嵌套反序列化=JsonUtility.FromJson(json);
Assert.AreEqual(反序列化的.data.data,“foo”);
var reserialized=JsonUtility.ToJson(反序列化);
AreEqual(json,重新序列化);
}
}
}
公屋
{
公共字符串数据;
}
公共类嵌套
{
公共数据;
}
公共类数据
{
公共字符串数据;
}
失败的输出如下所示:

Nested (0.009s)
---
System.NullReferenceException : Object reference not set to an instance of an object
---
at Tests.FromJson.Nested () [0x0000e] in /Users/bgates/Unity/Virtual Store/Assets/Tests/Serialization.cs:23 
  at (wrapper managed-to-native) System.Reflection.MonoMethod.InternalInvoke(System.Reflection.MonoMethod,object,object[],System.Exception&)
  at System.Reflection.MonoMethod.Invoke (System.Object obj, System.Reflection.BindingFlags invokeAttr, System.Reflection.Binder binder, System.Object[] parameters, System.Globalization.CultureInfo culture) [0x00032] in <ac823e2bb42b41bda67924a45a0173c3>:0
嵌套(0.009s)
---
System.NullReferenceException:对象引用未设置为对象的实例
---
位于/Users/bgates/Unity/Virtual Store/Assets/Tests/Serialization.cs:23中的Tests.FromJson.Nested()[0x0000e]
在(包装器管理为本机)System.Reflection.MonoMethod.InternalInvoke(System.Reflection.MonoMethod,object,object[],System.Exception&)
在System.Reflection.MonMethod.Invoke(System.Object obj、System.Reflection.BindingFlags invokeAttr、System.Reflection.Binder Binder、System.Object[]参数、System.Globalization.CultureInfo culture)[0x00032]中:0

任何帮助都将不胜感激。谢谢大家!

结果是我丢失了
[System.Serializable]

以下测试通过:

using NUnit.Framework;
using UnityEngine;

namespace Tests
{
  public class FromJson
  {
    [Test]
    public void Flat()
    {
      string json = "{\"foo\":\"bar\"}";
      Flat deserialized = JsonUtility.FromJson<Flat>(json);
      Assert.AreEqual(deserialized.foo, "bar");
      var reserialized = JsonUtility.ToJson(deserialized);
      Assert.AreEqual(json, reserialized);
    }

    [Test]
    public void Nested()
    {
      string json = "{\"foo\":{\"foo\":\"bar\"}}";
      Nested deserialized = JsonUtility.FromJson<Nested>(json);
      Assert.AreEqual(deserialized.foo.foo, "bar");
      var reserialized = JsonUtility.ToJson(deserialized);
      Assert.AreEqual(json, reserialized);
    }
  }
}

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

[System.Serializable]
public class Flat
{
  public string foo;
}

[System.Serializable]
public class Nested
{
  public Foo2 foo;
}

[System.Serializable]
public class Foo2
{
  public string foo;
}
使用NUnit.Framework;
使用UnityEngine;
命名空间测试
{
来自JSON的公共类
{
[测试]
公屋单位(
{
字符串json=“{\“foo\”:\“bar\”}”;
平面反序列化=JsonUtility.FromJson(json);
AreEqual(反序列化的.foo,“bar”);
var reserialized=JsonUtility.ToJson(反序列化);
AreEqual(json,重新序列化);
}
[测试]
公共空嵌套()
{
字符串json=“{\'foo\':{\'foo\':\'bar\'}”;
嵌套反序列化=JsonUtility.FromJson(json);
AreEqual(反序列化的.foo.foo,“bar”);
var reserialized=JsonUtility.ToJson(反序列化);
AreEqual(json,重新序列化);
}
}
}
[系统可序列化]
福班
{
公共字符串栏;
}
[系统可序列化]
公屋
{
公共字符串foo;
}
[系统可序列化]
公共类嵌套
{
公共食品2食品;
}
[系统可序列化]
公开课2
{
公共字符串foo;
}

这里有很多关于JsonUtility的信息:您可能会发现MiniJSON或JSON.Net对于任何东西都更有用,除了最简单的解析。您还应该通读文档。您的类应该具有[System.Serializable]属性。对于嵌套数组或列表,您不能依赖Unity的
JsonUtility
。去商店购买JSON.net。