JSON读取器异常:分析值时遇到意外字符:{ [结束]

hc8w905p  于 2022-12-15  发布在  其他
关注(0)|答案(2)|浏览(114)

**已关闭。**此问题需要debugging details。当前不接受答案。

编辑问题以包含desired behavior, a specific problem or error, and the shortest code necessary to reproduce the problem。这将有助于其他人回答问题。
2天前关闭。
Improve this question
我是一个新手与Json的东西。我有一个项目,正在使用牛顿软件。我有这个对象
'

namespace ConsoleApp1
{
    [JsonObject(MemberSerialization.OptIn)]
    public class Data
    {

        [JsonProperty]
        public bool IsActive { get; set; } = false;

        [JsonProperty]
        public string Source { get; set; }

        [JsonProperty]
        public object SourceData { get; set; }

        [JsonProperty]
        public bool IsClickable { get; set; } = true;

        [JsonConstructor]
        public Data(string Source = "", string SourceData = "", bool IsActive = false, bool IsClickable = true)
        {
            this.IsActive = IsActive;
            this.Source = Source;
            this.SourceData = SourceData;
            this.IsClickable = IsClickable;
        }
    }

    class Program
    {
        static void Main(string[] args)
        {
            JsonSerializerSettings JsonSettings = new JsonSerializerSettings { TypeNameHandling = TypeNameHandling.Auto, NullValueHandling = NullValueHandling.Ignore };
            Data data = new Data() { IsActive = true, Source = "test", SourceData = new List<int> { 1, 2, 3 }, IsClickable = false };
            string json = JsonConvert.SerializeObject(data, Formatting.Indented, JsonSettings);
            Console.WriteLine(json);
            Data dataDes = JsonConvert.DeserializeObject<Data>(json, JsonSettings);
            Console.WriteLine(dataDes);
        }
    }
}

'
所以当它被序列化时,我得到了这个:
'

{
  "IsActive": true,
  "Source": "test",
  "SourceData": {
    "$type": "System.Collections.Generic.List`1[[System.Int32, System.Private.CoreLib]], System.Private.CoreLib",
    "$values": [
      1,
      2,
      3
    ]
  },
  "IsClickable": false
}

'
但是当它被反序列化时,我得到这个错误:Newtonsoft.Json.JsonReaderException:'分析值时遇到意外字符:{。路径“SourceData”,第4行,位置17。'
我是否忘记在某个地方设置一些东西,以使元数据在反序列化时工作?

csga3l58

csga3l581#

为了反序列化你发布的json,你需要再创建一个类,在这个类正常工作之后

Data data =  JsonConvert.DeserializeObject<Data>(json, 
   new JsonSerializerSettings { TypeNameHandling = TypeNameHandling.All }
);

public class Data
{
    public DropdownData DropdownData {get;set;}
}

更新
既然你换了个问题,那也行

var data =  JsonConvert.DeserializeObject<DropdownData>(json, 
new JsonSerializerSettings { TypeNameHandling = TypeNameHandling.All } );
6pp0gazn

6pp0gazn2#

从您的问题来看,问题在于您如何在SourceData上使用对象属性。当Json进行序列化时,它足够聪明地检测到对象数据类型实际上是一个数组,并相应地处理它。
当对象被反序列化时,它阅读数据类型为“string”的构造函数,并试图将其反序列化为字符串,这就是为什么当它找到数组[而不是字符串“”的开头时会出错。
此修改后的构造函数应正常工作(使用MySkullCavelsADarkPlace注解进行调整)

[JsonConstructor]
    public Data(string Source = "", JToken SourceData = null, bool IsActive = false, bool IsClickable = true)
     {
        

        this.IsActive = IsActive;
        this.Source = Source;
        
        this.SourceData = SourceData;
        // JToken.Type will hold the type that the deseralizer for Newtonsoft.Json determine that the type is
        var sourceType = SourceData.Type;

        this.IsClickable = IsClickable;
    }

相关问题