56

I have a class like this:

public class MyStok
{
    public int STId { get; set; }
    public int SM { get; set; }
    public string CA { get; set; }
    public string Br { get; set; }
    public string BNo { get; set; }
    public decimal Vat { get; set; }
    public decimal Price { get; set; }
}

I deserialize like this:

string sc = e.ExtraParams["sc"].ToString();
MyStok myobj = JSON.Deserialize<MyStok>(sc);

My output seems to be like this (string sc) on fiddler:

[
    {
        "STId": 2,
        "CA": "hbh",
        "Br": "jhnj",
        "SM": 20,
        "Vat": 10,
        "Price": 566,
        "BNo": "1545545"
    }
]

But I get the error:

Cannot deserialize the current JSON array (e.g. [1,2,3]) into type [...]

What is wrong in that code?

robyaw
  • 2,274
  • 2
  • 22
  • 29
sakir
  • 3,391
  • 8
  • 34
  • 50

5 Answers5

110

It looks like the string contains an array with a single MyStok object in it. If you remove square brackets from both ends of the input, you should be able to deserialize the data as a single object:

MyStok myobj = JSON.Deserialize<MyStok>(sc.Substring(1, sc.Length-2));

You could also deserialize the array into a list of MyStok objects, and take the object at index zero.

var myobjList = JSON.Deserialize<List<MyStok>>(sc);
var myObj = myobjList[0];
Sergey Kalinichenko
  • 714,442
  • 84
  • 1,110
  • 1,523
28

For array type Please try this one.

 List<MyStok> myDeserializedObjList = (List<MyStok>)Newtonsoft.Json.JsonConvert.DeserializeObject(sc, typeof(List<MyStok>));

Please See here for details to deserialise Json

Mark Rotteveel
  • 100,966
  • 191
  • 140
  • 197
Janty
  • 1,708
  • 2
  • 15
  • 29
2

Another alternative if you have a root level array with no name and you actually want to use it for something, like adding methods

public class MyStoks : List<MyStok> 
{

}

Then you can deserialize like this

MyStoks myObj = JsonConvert.DeserializeObject<MyStoks>(jsonString);
John
  • 192
  • 3
  • 12
1

I ran into this exact same error message. I tried Aditi's example, and then I realized what the real issue was. (Because I had another apiEndpoint making a similar call that worked fine.) In this case The object in my list had not had an interface extracted from it yet. So because I apparently missed a step, when it went to do the bind to the

List<OfthisModelType>

It failed to deserialize.

If you see this issue, check to see if that could be the issue.

Veretax
  • 23
  • 1
  • 3
-1
HttpClient webClient = new HttpClient();
Uri uri = new Uri("your url");
HttpResponseMessage response = await webClient.GetAsync(uri)
var jsonString = await response.Content.ReadAsStringAsync();
var objData = JsonConvert.DeserializeObject<List<CategoryModel>>(jsonString);
  • This doesn't really add any value to the question or the other answers. – infl3x Apr 25 '17 at 10:26
  • this will apply only if you have HttpClient Call I marked as the answer is useful Cause the last line has the answer which is Deserialize it as a list of the class JsonConvert.DeserializeObject>(jsonString); – khaled Dehia Jul 03 '17 at 17:00
  • Thank you for this code snippet, which might provide some limited, immediate help. A [proper explanation](https://meta.stackexchange.com/q/114762/349538) would greatly improve its long-term value by showing why this is a good solution to the problem and would make it more useful to future readers with other, similar questions. Please [edit] your answer to add some explanation, including the assumptions you’ve made. – jasie Mar 02 '21 at 09:37