【问题标题】:Able to deserialize string type but not object type能够反序列化字符串类型但不能反序列化对象类型
【发布时间】:2017-09-07 09:50:42
【问题描述】:

我在 JSON.NET 中使用 C#。以下是两种类型。

   JSON object -  var user = { "name": "test", "title": "mytitle"};
   JSON String -  var user1 = "{ \"name\": \"test\", \"title\": \"mytitle\" }";     

使用 Newtonsoft.Json 反序列化 JSON 对象。我在其中处理 JSON 的 C# 代码。

      public class sampledata
      {
        [JsonProperty("name")]
        public string name { get; set; }

         [JsonProperty("title")]
        public string title { get; set; }
      }
     public void SampleEvent(string param)
        {

            sampledata s = JsonConvert.DeserializeObject<sampledata>(param);
         }

当我在参数中得到 JSON 字符串时,反序列化很好。 但是当我在参数中得到 JSON 对象时 - 我得到的第一个错误是

"无法将当前的 JSON 数组(例如 [1,2,3])反序列化为 'UCRS.MainWindow+sampledata' 类型,因为该类型需要 JSON 对象 (例如 {"name":"value"}) 正确反序列化。

要修复此错误,请将 JSON 更改为 JSON 对象(例如 {"name":"value"}) 或将反序列化类型更改为数组或 实现集合接口的类型(例如 ICollection、IList) 比如可以从 JSON 数组反序列化的 List。 JsonArrayAttribute 也可以添加到类型中以强制它 从 JSON 数组反序列化。

路径'',第 1 行,位置 1。

所以我把代码改成了:

      List<sampledata> s = JsonConvert.DeserializeObject<List<sampledata>>(param);

然后我面临不同的问题

" 解析值时遇到意外字符: o. Path '', 第 1 行,位置 1。”

当网页中出现某些事件时,我正在使用 webbrowser objectforscripting 在 c# 中处理该事件。我总是将 JSON 对象作为参数。如何在 C# 中反序列化 JSON 对象?请帮忙

【问题讨论】:

  • 发布引发此错误的确切 json 字符串,而不是模型
  • 如何用对象调用方法? object.ToString() 将不起作用,因为该对象是匿名类型,不会将字符串转换为 JSON 字符串
  • @Rahul - 这是相同的抛出错误示例。 { "name": "test", "title": "mytitle"} 这是尝试反序列化抛出错误时的 JSON 对象。
  • @SwethaBindu - 您不能反序列化对象(如“将二进制/字符串表示形式读入内存对象”)- 它已经是,只是不是您想要的类型。

标签: c# json json.net deserialization


【解决方案1】:

它非常简单......两者都适用

string jsonObject = @"{""name"":""test"",""title"":""mytitle""}";
var jsonString = "{ \"name\": \"test\", \"title\": \"mytitle\" }";

var values1 = JsonConvert.DeserializeObject<Dictionary<string, string>>(jsonObject);
var values2 = JsonConvert.DeserializeObject<Dictionary<string, string>>(jsonString);

这也有效

var values3 = JsonConvert.DeserializeObject<sampledata>(jsonObject);

我创建了 JObject

           JObject jObject = new JObject
           {
               {"name", "test" },
               {"title", "mytitle" }
           };
           string jObjectStr = jObject.ToString();
var values = JsonConvert.DeserializeObject<sampledata>(jObjectStr);

【讨论】:

    【解决方案2】:

    更新的代码行:

    List<sampledata> s = JsonConvert.DeserializeObject<List<sampledata>>(param);
    

    完全没问题。

    这里的问题是,当您尝试反序列化为列表时,反序列化程序需要一个数组。

    试着把它变成一个数组。将这行代码添加到参数字符串中:

    param ="["+param+"]";//make it an array before deserialization
    

    完整代码:

    public class sampledata
      {
        [JsonProperty("name")]
        public string name { get; set; }
    
         [JsonProperty("title")]
        public string title { get; set; }
      }
     public void SampleEvent(string param)
        {
            param ="["+param+"]";//make it an array before deserialization
            List<sampledata> s = JsonConvert.DeserializeObject<List<sampledata>>(param);
         } 
    

    【讨论】:

      猜你喜欢
      • 2023-03-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-12-13
      • 2020-01-26
      相关资源
      最近更新 更多