【问题标题】:JsonReaderException when deserializing object反序列化对象时出现 JsonReaderException
【发布时间】:2021-04-17 11:13:27
【问题描述】:

我正在尝试使用 C# 了解 JSON 的序列化/反序列化,因此编写了以下类来提供帮助。

using Newtonsoft.Json;
using System;
using System.Collections.Generic;

namespace HelloWorld
{
    class Size
    {
        public double ArmLength { get; set; }
        public HandPosition HandPosition { get; set; }
    }

    class HandPosition
    {
        public double X { get; set; }
        public double Y { get; set; }
        public double Z { get; set; }
    }
    class Dictionary
    {
        static void Main(string[] args)
        {
            Size size = new Size();
            size.ArmLength = 2.13;
            size.HandPosition = new HandPosition
            {
                X = 2.13,
                Y = 2.14,
                Z = 2.15
            };

            string output = JsonConvert.SerializeObject(size, Formatting.Indented);
            Console.WriteLine("Output: " + output);

            var values = JsonConvert.DeserializeObject<Dictionary<string, string>>(output);
            Console.WriteLine(decimal.Parse(values["HandPosition"]["X"]));
            Console.WriteLine(decimal.Parse(values["ArmLength"]));



            Console.WriteLine("Press Enter to continue");
            Console.Read();
        }
    }
}

当我运行它时,我在var values = JsonConvert.DeserializeObject&lt;Dictionary&lt;string, string&gt;&gt;(output); 得到以下异常:

Newtonsoft.Json.JsonReaderException: '解析值时遇到意外字符: {.路径“HandPosition”,第 3 行,位置 19。

我在这里做错了什么,我该如何解决?

【问题讨论】:

  • 因为HandPosition 是一个对象。你试过Dictionary&lt;string, object&gt;吗?

标签: c# json .net json.net


【解决方案1】:

你把它复杂化了。要反序列化一个对象,您只需调用JsonConvert.DeserializeObject&lt;Size&gt;(output),其中Size 也是您要反序列化的类型。

static void Main(string[] args)
{
    Size size = new Size();
    size.ArmLength = 2.13;
    size.HandPosition = new HandPosition
    {
        X = 2.13,
        Y = 2.14,
        Z = 2.15
    };

    string output = JsonConvert.SerializeObject(size, Formatting.Indented);
    Console.WriteLine("Output: " + output);

    var deserializeSize = JsonConvert.DeserializeObject<Size>(output);
    Console.WriteLine($"deserializeSize.Handposition.X = {deserializeSize.HandPosition.X}");
    Console.WriteLine($"deserializeSize.ArmLength = {deserializeSize.ArmLength}");

    Console.WriteLine("Press Enter to continue");
    Console.Read();
}

作为警告,我不鼓励使用 .NET 内置类作为自定义类名,因为当有多个同名类时它会变得混乱。 Dictionary 和 Size 在你的情况下是有问题的。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-12-09
    • 2020-07-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多