【问题标题】:Referencing an object inside another object causes JsonSerializationException在另一个对象中引用一个对象会导致 JsonSerializationException
【发布时间】:2018-05-31 20:29:49
【问题描述】:

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

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

{
    "operation": "pin",
    "question": {
        "studentPin": "123456"
    }
}

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

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);

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

 //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);

我收到以下错误:

JsonSerializationException:检测到类型为“Question”.Path 的属性“question”的自引用循环

我已经用谷歌搜索了这个错误,并了解到这通常发生在您的模型类中有对父对象的引用并且父对象有对其子对象的引用时,这会在序列化过程中导致循环引用。

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

我的问题类设置如下:

public class Question : MonoBehaviour {

    public string studentPin;

}

我的 ServerRequest 类设置如下:

public class ServerRequest : MonoBehaviour {

    public string operation;
    public Question question;


}

任何帮助或指导将不胜感激。

【问题讨论】:

标签: c# unity3d json.net


【解决方案1】:
  1. 考虑改用JsonUtility.ToJson()
  2. 如果QuestionServerRequest 主要仅用于存储数据,请考虑不要从MonoBehaviour 继承它。

总之:

[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

【讨论】:

    【解决方案2】:

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

     JsonSerializerSettings settings = new JsonSerializerSettings
     {
        PreserveReferencesHandling = PreserveReferencesHandling.All,
        ReferenceLoopHandling = ReferenceLoopHandling.Serialize
     };
    
     string json = JsonConvert.SerializeObject(request, settings);
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-11-25
      • 2015-08-31
      • 1970-01-01
      • 2013-02-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-03-19
      相关资源
      最近更新 更多