【问题标题】:Deserializing JSON object using JSON.Net使用 JSON.Net 反序列化 JSON 对象
【发布时间】:2016-02-16 09:24:19
【问题描述】:

我正在尝试反序列化这个 JSON 对象,然后将其插入数据库:

{
    "PresiderEmailAddress": "kyitss@gmail.com",
    "MeetingNumber": "ME021616",
    "MeetingName": " Quotation Meeting",
    "MeetingDescription": "NULL",
    "MeetingDate": "2\/16\/2016",
    "MeetingVenue": "Consular Room",
    "TimeStarted": "12:00:00",
    "TimeEnded": "13:00:00",
    "CompletionRate": 0.0,
    "Remarks": "Actions still in progress"
}

但是我的 WCF 服务总是给我这个错误

无效的 JavaScript 属性标识符字符:}。路径 '',第 1 行,位置 19。

我在这里做错了什么?这是我的代码,顺便说一句:

public Int32 InsertMeeting(string jsonMeetingDetails)
{
    MeetingDetailsForDeserializing obj = JsonConvert.DeserializeObject<MeetingDetailsForDeserializing>(jsonMeetingDetails);

    using (SqlConnection connection = new SqlConnection(constring))
    {
        Int32 insertResult;
        SqlCommand cmd = new SqlCommand("Insert into dbo.Meeting(MeetingNumber, PresiderEmailAddress, MeetingName, MeetingDescription, MeetingDate, MeetingVenue, TimeStarted, TimeEnded,CompletionRate, Remarks) values(@MeetingNumber, @PresiderEmailAddress,@MeetingName, @MeetingDescription, @MeetingDate, @MeetingVenue, @TimeStarted, @TimeEnded, @CompletionRate, @Remarks)");
        cmd.CommandType = CommandType.Text;
        cmd.Connection = connection;
        cmd.Parameters.AddWithValue("@MeetingNumber", obj.jMeetingNumber);
        cmd.Parameters.AddWithValue("@PresiderEmailAddress", obj.jPresiderEmailAddress);
        cmd.Parameters.AddWithValue("@MeetingName", obj.jMeetingName);
        cmd.Parameters.AddWithValue("@MeetingDescription", obj.jMeetingDescription);
        cmd.Parameters.AddWithValue("@MeetingDate", obj.jMeetingDate);
        cmd.Parameters.AddWithValue("@MeetingVenue", obj.jMeetingVenue);
        cmd.Parameters.AddWithValue("@TimeStarted", obj.jTimeStarted);
        cmd.Parameters.AddWithValue("@TimeEnded", obj.jTimeEnded);
        cmd.Parameters.AddWithValue("@CompletionRate", obj.jCompletionRate);
        cmd.Parameters.AddWithValue("@Remarks", obj.jRemarks);

        connection.Open();
        insertResult = cmd.ExecuteNonQuery();
        connection.Close();

        if (insertResult == 1)
        {
            return 1;
        }
        else 
        {
            return 0;
        }
    }
}

编辑 我昨晚在寻找示例,似乎我用来反序列化对象的类与 JSON 不匹配。而且根据下面的帖子,我把它改成了这样:

[DataContract]
public class MeetingDetailsForDeserializing
{
    [DataMember(Order = 0)]
    public string jPresiderEmailAddress { get; set; }

    [DataMember(Order = 1)]
    public string jMeetingNumber { get; set; }

    [DataMember(Order = 2)]
    public string jMeetingName { get; set; }

    [DataMember(Order = 3)]
    public string jMeetingDescription { get; set; }

    [DataMember(Order = 4)]
    public string jMeetingDate { get; set; }

    [DataMember(Order = 5)]
    public string jMeetingVenue { get; set; }

    [DataMember(Order = 6)]
    public string jTimeStarted { get; set; }

    [DataMember(Order = 7)]
    public string jTimeEnded { get; set; }

    [DataMember(Order = 8)]
    public decimal jCompletionRate { get; set; }

    [DataMember(Order = 9)]
    public string jRemarks { get; set; }

}

对此:

[DataContract]
public class MeetingDetailsForDeserializing
{
    [DataMember(Order = 0)]
    public string PresiderEmailAddress { get; set; }

    [DataMember(Order = 1)]
    public string MeetingNumber { get; set; }

    [DataMember(Order = 2)]
    public string MeetingName { get; set; }

    [DataMember(Order = 3)]
    public string MeetingDescription { get; set; }

    [DataMember(Order = 4)]
    public string MeetingDate { get; set; }

    [DataMember(Order = 5)]
    public string MeetingVenue { get; set; }

    [DataMember(Order = 6)]
    public string TimeStarted { get; set; }

    [DataMember(Order = 7)]
    public string TimeEnded { get; set; }

    [DataMember(Order = 8)]
    public decimal CompletionRate { get; set; }

    [DataMember(Order = 9)]
    public string Remarks { get; set; }

}

但我仍然必须对其进行测试,看看它是否有效。顺便说一句,我如何使用 Fiddler 进行测试?

编辑好吧,当我在 Fiddler 上测试时,WCF 又给了我一个错误:

解析值时遇到意外字符:d。路径'',第 0 行,第 0 位置。

我检查了 JSON 示例。不可能有未知字符。

【问题讨论】:

  • 调试的时候,反序列化后obj是否真的包含正确的数据?
  • 调试的时候,jsonMeetingDetails字符串真的是这样的吗?它可能是 HTML 编码的吗?还是包含转义字符?编辑:实际上它看起来可能是由 MeetingDate 中的转义字符引起的
  • @FelixAv 我什至看不到数据,因为它不断给我 Invalid Javascript 错误
  • @MaxJ 我想是的。我会试试看这是否真的是问题

标签: c# json wcf


【解决方案1】:

在运行时不看内容很难判断,但正如 MaxJ 所说,这可能与 MeetingDate 中的转义字符有关,因此请尝试在“2/16/2016”前面弹出一个@符号来否定它们。

【讨论】:

    【解决方案2】:

    为什么在 j 前面加上 MeetingDetailsForDeserializing 的属性?您的 json 字符串应与属性匹配。我试图模仿你所拥有的相同的 json,并且我能够成功地反序列化它。最初我期待日期错误,但这并没有发生。你能展示一下 MeetingDetailsForDeserializing 类吗?

    但是,这是我尝试过的测试的快照。
    JS 模型

    var data1 = {
                "PresiderEmailAddress": "kyitss@gmail.com",
                "MeetingNumber": "ME021616",
                "MeetingName": " Quotation Meeting",
                "MeetingDescription": "NULL",
                "MeetingDate": "2\/16\/2016",
                "MeetingVenue": "Consular Room",
                "TimeStarted": "12:00:00",
                "TimeEnded": "13:00:00",
                "CompletionRate": 0.0,
                "Remarks": "Actions still in progress"
            };

    [这是c#模型类]

     [DataContract]
    public class MeetingDetailsForDeserializing
    {
        [DataMember(Order = 0)]
        public string MeetingNumber { get; set; }
        [DataMember(Order = 1)]
        public string PresiderEmailAddress { get; set; }
        [DataMember(Order = 2)]
        public string MeetingName { get; set; }
        [DataMember(Order = 3)]
        public string MeetingDescription { get; set; }
        [DataMember(Order = 4)]
        public DateTime MeetingDate { get; set; }
        [DataMember(Order = 5)]
        public string MeetingVenue { get; set; }
        [DataMember(Order = 6)]
        public string TimeStarted { get; set; }
        [DataMember(Order = 7)]
        public string TimeEnded { get; set; }
        [DataMember(Order = 8)]
        public string CompletionRate { get; set; }
        [DataMember(Order = 9)]
        public string Remarks { get; set; }
    }
    

    如果我遗漏了什么,请告诉我。

    【讨论】:

    • 请编辑您的答案并发布格式化代码,而不是发布图片。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-08-14
    • 1970-01-01
    • 1970-01-01
    • 2013-07-25
    • 1970-01-01
    • 2011-05-30
    • 1970-01-01
    相关资源
    最近更新 更多