Ошибка JSON.NET "Невозможно десериализовать текущий массив JSON (например, [1,2,3]) в тип, потому что типу требуется объект JSON (например, {" name ":" value "})" - PullRequest
0 голосов
/ 28 ноября 2018

У меня есть следующее WebCleint для вызова веб-службы Restful внутри моего консольного приложения .net: -

try
{
    using (WebClient wc = new WebClient())
    {
        wc.Encoding = Encoding.UTF8;
        string url = "https://*****/paged?hapikey=*********&properties=website&properties=i_scan&limit=2";//web service url
        string tempurl = url.Trim();
        var json = wc.DownloadString(tempurl);//get the json
        Marketing ipfd = JsonConvert.DeserializeObject<Marketing>(json);//deserialize
    }
}
catch (Exception e)
{
    //code goes here..
}

, где я использую JSON.Net для десериализации объекта json, который будетследуйте: -

{
  "has-more": true,
  "offset": 622438650,
  "companies": [
    {
      "portalId": *******,
      "companyId": *****,
      "isDeleted": false,
      "properties": {
        "website": {
          "value": "****.net",
          "timestamp": 1520938239457,
          "source": "CALCULATED",
          "sourceId": null,
          "versions": [
            {
              "name": "website",
              "value": "*****.net",
              "timestamp": 1520938239457,
              "source": "CALCULATED",
              "sourceVid": [
                731938234
              ]
            }
          ]
        }
      },
      "additionalDomains": [],
      "stateChanges": [],
      "mergeAudits": []
    },
    {
      "portalId": ******,
      "companyId": ******,
      "isDeleted": false,
      "properties": {
        "website": {
          "value": "****.***.***",
          "timestamp": 1512488590073,
          "source": "CALCULATED",
          "sourceId": null,
          "versions": [
            {
              "name": "website",
              "value": "****.***8.****",
              "timestamp": 1512488590073,
              "source": "CALCULATED",
              "sourceVid": []
            }
          ]
        },
        "i_scan": {
          "value": "Yes",
          "timestamp": 1543409493459,
          "source": "******",
          "sourceId": "**************",
          "versions": [
            {
              "name": "i_scan",
              "value": "Yes",
              "timestamp": 1543409493459,
              "sourceId": *****",
              "source": "CRM_UI",
              "sourceVid": [],
              "requestId": "******"
            }
          ]
        }
      },
      "additionalDomains": [],
      "stateChanges": [],
      "mergeAudits": []
    }
  ]
}

Вот мои классы: -

public class Marketing
{
    public Companies companies { get; set; }
}

public class Companies
{
    public IList<string> companyId { get; set; }
    public IList<Properties> properties { get; set; }
}

public class Properties
{
    public IList<Website> website { get; set; }
    public IList<I_Scan> i_scan { get; set; }
}

public class Website
{
    public string value { get; set; }
}

public class i_Scan
{
    public string value { get; set; }
}

но в настоящее время я получаю это исключение, когда я пытаюсь десериализовать объект JSON: -

Newtonsoft.Json.JsonSerializationException was caught
  HResult=-2146233088
  Message=Cannot deserialize the current JSON array (e.g. [1,2,3]) into type 'MMarketing.Companies' because the type requires a JSON object (e.g. {"name":"value"}) to deserialize correctly.
To fix this error either change the JSON to a JSON object (e.g. {"name":"value"}) or change the deserialized type to an array or a type that implements a collection interface (e.g. ICollection, IList) like List<T> that can be deserialized from a JSON array. JsonArrayAttribute can also be added to the type to force it to deserialize from a JSON array.
Path 'companies', line 1, position 49.
  Source=Newtonsoft.Json
  StackTrace:

, поэтому я не уверен, почему JSON.NET не может правильно выполнить десериализацию, так как в моем случае классы совместимы с возвращенным объектом json ??

Ответы [ 2 ]

0 голосов
/ 28 ноября 2018

Если я прихожу в JSON Blind, мне нравится использовать http://json2csharp.com/, чтобы сгенерировать структуру моего класса для меня

public class Version
{
    public string name { get; set; }
    public string value { get; set; }
    public object timestamp { get; set; }
    public string source { get; set; }
    public List<object> sourceVid { get; set; }
}

public class Website
{
    public string value { get; set; }
    public object timestamp { get; set; }
    public string source { get; set; }
    public object sourceId { get; set; }
    public List<Version> versions { get; set; }
}

public class Version2
{
    public string name { get; set; }
    public string value { get; set; }
    public long timestamp { get; set; }
    public int sourceId { get; set; }
    public string source { get; set; }
    public List<object> sourceVid { get; set; }
    public int requestId { get; set; }
}

public class IScan
{
    public string value { get; set; }
    public long timestamp { get; set; }
    public int source { get; set; }
    public int sourceId { get; set; }
    public List<Version2> versions { get; set; }
}

public class Properties
{
    public Website website { get; set; }
    public IScan i_scan { get; set; }
}

public class Company
{
    public int portalId { get; set; }
    public int companyId { get; set; }
    public bool isDeleted { get; set; }
    public Properties properties { get; set; }
    public List<object> additionalDomains { get; set; }
    public List<object> stateChanges { get; set; }
    public List<object> mergeAudits { get; set; }
}

public class Marketing
{
    public bool has_more { get; set; }
    public int offset { get; set; }
    public List<Company> companies { get; set; }
}

 var result = JsonConvert.DeserializeObject<Marketing>(json);
0 голосов
/ 28 ноября 2018

На первый взгляд кажется, что вы поменяли два свойства в Делая их List и наоборот.

public class Marketing
{
    public List<Companies> companies { get; set; }
}

- это "companies": [ в json, тогда как "companyId": *****, - это id как строка, а не массив.Properties также не является массивом, но свойство versions из properties равно.

public class Companies
{
    public string companyId { get; set; }
    public Properties properties { get; set; }
}
...