user1667474
user1667474

Reputation: 819

Xamarin.Forms deserialising json to an object

var myObjectList = (List<MyObject>)JsonConvert.DeserializeObject(strResponseMessage, typeof(List<MyObject>));

the above works to deserialise a JSON string to a list of custom objects when the JSON has the following format

[
   {
     "Name": "Value"
   },
   {
     "Name": "Value"
   },
   {
     "Name": "Value"
   },
   "Name": "Value"
   }
]

I don't know how to do the same when the format is like this

{
    "ReturnedData" : [
       {
         "Name": "Value"
       },
       {
         "Name": "Value"
       },
       {
         "Name": "Value"
       },
       "Name": "Value"
       }
    ]

}

I can get the data like this

JObject information = JObject.Parse(strResponseMessage);
foreach (dynamic data in information)
{
   //convert to object here
}

and that works for Android but it seems that you cannot use a type of 'dynamic' for iOS as I get the error:

Object type Microsoft.CSharp.RuntimeBinder.CSharpInvokeMemberBinder cannot be converted to target type: System.Object[]

What step am I missing to convert the second JSON string to the first?

Upvotes: 1

Views: 6078

Answers (3)

user1667474
user1667474

Reputation: 819

Thanks for your replies - I was able to solve it as follows

JObject information = JObject.Parse(strResponseMessage);

string json = JsonConvert.SerializeObject(strResponseMessage["ReturnedData "]);

var myObjectList = (List<MyObject>)JsonConvert.DeserializeObject(json , typeof(List<MyObject>));

Works perfectly!

Upvotes: 1

Art
Art

Reputation: 3167

If JsonConvert is JSON.Net just instead of List use

public class MyClass {
    public List<MyObject> ReturnedData { get; set; }
}

Upvotes: 2

Pete
Pete

Reputation: 4746

You can't use the dynamic keyword on iOS as its forbidden to generate code as it states in this link.

Quote:-

No Dynamic Code Generation

Since the iPhone's kernel prevents an application from generating code dynamically Mono on the iPhone does not support any form of dynamic code generation.

These include:

The System.Reflection.Emit is not available.

Quote:-

System.Reflection.Emit

The lack of System.Reflection. Emit means that no code that depends on runtime code generation will work. This includes things like:

The Dynamic Language Runtime.

Any languages built on top of the Dynamic Language Runtime.

Apparently there is some support creeping in from v7.2 as can be seen in this link - See @Rodja answer. - however - its very experimental and has flaws preventing this from fully working.

Your best approach would be to process the JObject - without - reying on the dynamic keyword and you will be alright on both Android and iOS.

Upvotes: 1

Related Questions