能够反序列化字符串类型但不能反对对象类型

时间:2017-09-07 09:50:42

标签: c# json json.net deserialization

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

   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);
         }

当我在param中获得JSON String时,反序列化很好。但是当我在param中获得JSON对象时 - 我得到的第一个错误是

  
    

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

  
     

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

     

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

所以我将代码更改为:

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

然后我面临不同的问题

  

“解析值时遇到意外的字符:o。路径'',   第1行,第1位。“

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

2 个答案:

答案 0 :(得分:0)

非常简单..适用于两者

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);

答案 1 :(得分:0)

更新后的代码行:

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

非常好。

这里的问题是当您尝试反序列化到列表时,反序列化器期望一个数组。

尝试将其设为数组。将这行代码添加到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);
     }