引用另一个对象内的对象会导致JsonSerializationException

时间:2018-05-31 20:29:49

标签: c# unity3d json.net

我是Unity / C#的新手,很难将两个对象转换为JSON。

目标是构建一个如下所示的JSON对象:

Question question = new Question();
question.setStudentPin(pin);
ServerRequest request = new ServerRequest();
request.setOperation(Constants.PIN_OPERATION);
//set the values entered for the pin entered
request.setQuestion(question);

String json = gson.toJson(request);

在Java中,我只需执行以下操作:

 //Creating a new Question object
 Question question = new Question();
 question.studentPin = pinNumber.text;
 ServerRequest request = new ServerRequest();
 request.operation = Constants.PIN_OPERATION;
 //set the values entered for the pin entered
 request.question = question;

 string json = JsonConvert.SerializeObject(request);

但是,当我在C#中执行以下操作时

public class Question : MonoBehaviour {

    public string studentPin;

}

我收到以下错误:

JsonSerializationException:检测到属性的自引用循环问题'使用类型'问题'。路径

我已经搜索了这个错误,并且理解这通常发生在您的模型类中有一个返回父对象的引用,并且该父对象有一个返回其子对象的引用,这会在序列化期间导致循环引用。

但是,我不确定我究竟能如何解决这些问题。

我的问题课程设置如下:

public class ServerRequest : MonoBehaviour {

    public string operation;
    public Question question;


}

我的ServerRequest类设置如下:

{{1}}

非常感谢任何帮助或指导。

2 个答案:

答案 0 :(得分:1)

  1. 请考虑使用JsonUtility.ToJson()
  2. 如果QuestionServerRequest主要用于存储数据,请考虑不要从MonoBehaviour继承它。
  3. 总之:

    [System.Serializable]
    public class Question {
        public string studentPin;
    }
    
    [System.Serializable]
    public class ServerRequest {
        public string operation;
        public Question question;
    }
    
    //Do your instantiation, setups, etc as above.
    string json = JsonUtility.ToJson(request);
    

    详细了解Unity的序列化here

答案 1 :(得分:0)

您应该使用JsonSerializaerSettings类并设置基于参考的序列化:

 JsonSerializerSettings settings = new JsonSerializerSettings
 {
    PreserveReferencesHandling = PreserveReferencesHandling.All,
    ReferenceLoopHandling = ReferenceLoopHandling.Serialize
 };

 string json = JsonConvert.SerializeObject(request, settings);