JsonTypeCoercionException:只有具有默认构造函数的对象才能反序列化

本文关键字:对象 反序列化 默认 JsonTypeCoercionException 构造函数 | 更新日期: 2023-09-27 17:56:17

我正在使用 C#(通过 Unity3D 中的 Mono)使用 JsonFx 来序列化一些数据,但我得到:"JsonTypeCoercionException:只有具有默认构造函数的对象才能反序列化。(Level[])"当我尝试反序列化数据时。

我尝试将默认构造函数添加到序列化类,但仍然收到错误。Fwiw,我在类似的线程中尝试了不同的建议:http://forum.unity3d.com/threads/117256-C-deserialize-JSON-array

这是我的代码:

//C#
using System;
using UnityEngine;
using System.Collections;
using JsonFx.Json;
using System.IO;
public class LoadLevel : MonoBehaviour {

string _levelFile = "levels.json"; 
Level[] _levels; 
void Start () {
    if (!File.Exists (_levelFile)){
        // write an example entry so we have somethng to read
        StreamWriter sw = File.CreateText(_levelFile);
        Level firstLevel = new Level();
        firstLevel.LevelName = "First Level";               
        firstLevel.Id = Guid.NewGuid().ToString();

        sw.Write(JsonFx.Json.JsonWriter.Serialize(firstLevel)); 
        sw.Close();
    }

    // Load our levels
    if(File.Exists(_levelFile)){
        StreamReader sr = File.OpenText(_levelFile);
        _levels = JsonReader.Deserialize<Level[]>(sr.ReadToEnd());
    }
}
}

下面是它要序列化的对象:

using UnityEngine;
using System.Collections;
using System; 
public class Level {
public string Id;
public string LevelName;
public Level() {}
}

有什么想法吗?我已经尝试过使用和不使用 Level() 构造函数。

JsonTypeCoercionException:只有具有默认构造函数的对象才能反序列化

我相信

您的 JSON 流实际上需要包含一个数组才能正常工作 - 它不能只是一个元素,因为您在反序列化中请求一个数组。

我认为您需要可序列化属性。

[System.Serializable]
public class Level 
 {
     public string Id;
     public string LevelName;
 }

然后,您的 json 级别数组必须如下所示:

{
  [
    { 
      "Id" : "1",
      "LevelName" : "first level"
    },
    { 
      "Id" : "2",
      "LevelName" : "second level"
    }
  ]
}