5

I am using Json.NET to create a definition of json whose structure may change. I am therefore unable to simply serialize a class and am creating the structure on the fly using Json to Linq. I am having issues creating the following structure using JObject, JArray, JProperty, etc

 {
  'external_id':'UNIQUE_ID_222222222',
  'firstname':'John',
  'lastname':'Smith',
  'customFields':
      {
        'custom1':'custom1 val',
        'custom2':'custom2 val',
        'custom3"':'custom3 val'
      }
  }

I tried using the following code:

Dim json As New JArray()
Dim jsonObj As New JObject( _
            New JProperty("external_id", "UNIQUE_ID_222222222"),
            New JProperty("firstname", "John"),
            New JProperty("lastname", "Smith"))

Dim jsonCustomFields As New JArray
Dim jsonCustomObject As New JObject

jsonCustomFields.Add(jsonCustomObject)

For Each field In CustomFieldList
    jsonCustomObject.Add(New JProperty(field.Label, field.Value))
Next    

jsonObj.Add(New JProperty("customFields", jsonCustomFields))
json.Add(jsonContrib)

However when I do this I get a different pattern that was not accepted by the webservice

{[
  {
    "external_id": "50702",
    "firstname": "John",
    "lastname": "Smithson",
    "customFields": [
      {
        "custom1":"custom1 val",
        "custom2":"custom2 val",
        "custom3":"custom3 val"
      }
    ]
  }
]}

I thought that I should be adding properties directly to the JArray but doing this causes a run time exception.

I have seen a similar pattern that is created when you deserialize a Dictionary(String, String) object but I don't really want to add my custom fields to a dictionary only to then deserialize them. It must be possible to create them using the above notation.

1 Answer 1

4

You do not need a JArray, instead use JObject

Following code is C# but you will be able to figure out

JObject jObject = new JObject();
jObject.Add(new JProperty("external_id", "UNIQUE_ID_222222222"));
jObject.Add(new JProperty( "firstname", "John" ));
jObject.Add(new JProperty( "lastname", "Smith" ));

JObject customFields = new JObject();
//Your loop
customFields.Add( "custom1", "custom1 val" );
customFields.Add( "custom2", "custom2 val" );
customFields.Add( "custom3", "custom3 val" );

jObject.Add( new JProperty( "customFields", customFields ) );

Let me know this works or not

Sign up to request clarification or add additional context in comments.

1 Comment

Thank you. That does work. I guess I got confused when I saw the list of iterated properties and automatically assumed "array"

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.