【问题标题】:Newtonsoft.Json.JsonReaderException: 'Unexpected character encountered while parsing valueNewtonsoft.Json.JsonReaderException: '解析值时遇到意外字符
【发布时间】:2021-06-10 08:33:54
【问题描述】:

我有一个来自第三方 API 的 Json 模型架构,如下所示:

    {
  "Entries": [
    {
      "Id": "",
      "RowId": 0,
      "FormId": "",
      "FormExternalId": "",
      "FormVersion": 0,
      "DeviceId": "",
      "UserFirstName": "",
      "UserLastName": "",
      "UserEmail": "",
      "UserExternalId": "",
      "Latitude": 0,
      "Longitude": 0,
      "StartTime": "Date",
      "CompleteTime": "Date",
      "ReceivedTime": "Date",
      "AnswerFormat": "",
      "Answers": [
        {
          "Name": "",
          "Type": "",
          "Value": "",
          "Answers": [
            "Answer_GET_"
          ]
        }
      ],
      "AnswersFlat": "Array[AnswerSet]",
      "AnswersFlatXml": "XML",
      "AnswersRawXml": "XML",
      "AnswersRawJson": "JSON",
      "TaskId": "",
      "DSRowId": "",
      "MediaAsUrl": false,
      "Fields": "",
      "PurgeDays": 0,
      "CompanyId": 0
    }
  ],
  "TotalRows": 0,
  "ResponseStatus": {
    "ErrorCode": "",
    "Message": "",
    "Errors": [
      {
        "ErrorCode": "",
        "FieldName": "",
        "Message": ""
      }
    ]
  }
}

我在 Visual Studio 中为此创建了一个类,如下所示:

class form_results
    {

        public class Rootobject
        {
            public Entry[] Entries { get; set; }
            public int TotalRows { get; set; }
            public Responsestatus ResponseStatus { get; set; }
        }

        public class Responsestatus
        {
            public string ErrorCode { get; set; }
            public string Message { get; set; }
            public Error[] Errors { get; set; }
        }

        public class Error
        {
            public string ErrorCode { get; set; }
            public string FieldName { get; set; }
            public string Message { get; set; }
        }

        public class Entry
        {
            public string Id { get; set; }
            public int RowId { get; set; }
            public string FormId { get; set; }
            public string FormExternalId { get; set; }
            public int FormVersion { get; set; }
            public string DeviceId { get; set; }
            public string UserFirstName { get; set; }
            public string UserLastName { get; set; }
            public string UserEmail { get; set; }
            public string UserExternalId { get; set; }
            public float Latitude { get; set; }
            public float Longitude { get; set; }
            public string StartTime { get; set; }
            public string CompleteTime { get; set; }
            public string ReceivedTime { get; set; }
            public string AnswerFormat { get; set; }
            public Answer[] Answers { get; set; }
            public string AnswersFlat { get; set; }
            public string AnswersFlatXml { get; set; }
            public string AnswersRawXml { get; set; }
            public string AnswersRawJson { get; set; }
            public string TaskId { get; set; }
            public string DSRowId { get; set; }
            public bool MediaAsUrl { get; set; }
            public string Fields { get; set; }
            public int PurgeDays { get; set; }
            public int CompanyId { get; set; }
        }

        public class Answer
        {
            public string Name { get; set; }
            public string Type { get; set; }
            public string Value { get; set; }
            public string[] Answers { get; set; }
        }

    }

当我尝试使用以下命令反序列化 json 时:

var parsedJson = JsonConvert.DeserializeObject<form_results.Rootobject>(json);

我收到错误“Newtonsoft.Json.JsonReaderException: '解析值时遇到意外字符: {. Path 'Entries[0].Answers[0].Answers', line 25, position 25.'”

Json 字符串的那部分看起来像这样:

     {... more json results...
"AnswerFormat": "Rich",
        "Answers": [{
            "Name": "Page 1",
            "Type": "Group",
            "Answers": [{
                    "Name": "Value 1",
                    "Type": "SelectOne"
                },
                {
                    "Name": "Value 2",
                    "Type": "SelectOne"
                }
            ]
        }]
    }

]

Json 是有效的,所以这不是问题。据我所知,问题出现在 Json 文件的数组部分。

也试过var parsedJson = JsonConvert.DeserializeObject &lt;List&lt;form_results.Rootobject&gt;&gt;(json);,但也报错。

我想要的是 Answers 数组中的结果(答案)。

【问题讨论】:

  • 我会先忽略你的数据模型——你能把它解析为JObject吗?如果是这样,您就知道问题出在 JSON 中,您可以提供一个 minimal reproducible example,显示 完整 JSON 文件和程序。

标签: c# json .net


【解决方案1】:

你的 Answer 类是这样声明的

public class Answer
{
            public string Name { get; set; }
            public string Type { get; set; }
            public string Value { get; set; }
            public string[] Answers { get; set; }
}

这包括string 中的array,称为Answers

但是在你的 JSON 中,这个数组是一个对象数组(摘录如下)

"Answers": [{
                    "Name": "Value 1",
                    "Type": "SelectOne"
                },
                {
                    "Name": "Value 2",
                    "Type": "SelectOne"
                }
            ]

所以你需要改变你的类来匹配这个 JSON。可能是这样的

public class Answer
{
            public string Name { get; set; }
            public string Type { get; set; }
            public string Value { get; set; }
            public SubAnswer[] Answers { get; set; }
}

public class SubAnswer
{
            public string Name { get; set; }
            public string Type { get; set; }
}

如果您希望 Answer 和 SubAnswer 相同,您也可以使用 Composite 模式。

【讨论】:

    【解决方案2】:

    看起来 answers 类可以包含更多 answers 这就是为什么你可以修改你的 Answer 类,如下所示:

     public class Answer
            {
                public string Name { get; set; }
                public string Type { get; set; }
                public string Value { get; set; }
                public List<Answer> Answers { get; set; }
            }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2022-11-05
      • 1970-01-01
      • 2014-06-09
      • 2016-02-24
      • 1970-01-01
      • 1970-01-01
      • 2017-08-30
      • 2020-05-09
      相关资源
      最近更新 更多