Click here to Skip to main content
15,078,444 members
Articles / Programming Languages / C#
Tip/Trick
Posted 7 Aug 2013

Tagged as

Stats

60.2K views
10 bookmarked

Process JSON files using .NET

Rate me:
Please Sign up or sign in to vote.
1.27/5 (3 votes)
7 Aug 2013CPOL2 min read
Advanced manipulation of JSON data using .NET

Introduction

In this tip, I’ll introduce my new .NET library for JSON file. It’s a new simple implementation that lets you parse and create JSON file and serialize your objects to json file and how to get them back (deserialize).

Background

We assume that you know JSON format (if not, check this). Some C# basics are required since the library is developed in C#.

Classes

The library is composed of 4 major classes:

System.Json.JsonElement: It represents a pair key-value object.

Key is a string value; however Value can be of any Type (int, float, char, bool, string, object, array … etc.)

System.Json.JsonArray: It represents a collection of objects that can be of any type and any dimension.

System.Json.JsonObject: It’s a collection of JsonElement object.

  • You can parse json data using class method JsonObject JsonObject.Parse(string json) ,  it takes json data as string, then returns a JsonObject 
  • You can fetch JsonElement using instance method JsonElement JsonObject.GetElementByKey(string key) , it takes a string key, then returns a JsonElement

System.Json.JsonFormatter: It is used for serialization and deserialization

It contains two class methods:

  • Void JsonFormatter.Serialize(object,Stream): It takes an object to be serialized and a stream object where to save json data
  • Object JsonFormatter.Deserialize(Type,Stream): It takes type of object to be retrieved and the stream from where to get json data, it returns an object of type Type.

Code Example

Example 1

In this example, I'll show you how to parse json data using class method JsonObject.Parse(string). Also how to get specific element using instance method JsonObject.GetElementByKey(string).

C# Code

C#
using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 
using System.Json; 

namespace Test_App
{     
  class Program   
  {        
     static void Main(string[] args)        
     {          string json = "{" + 
                               "\"Library\" : \"System.Json for .NET\"," +
                               "\"Author\" : { " +
                                            "\"Name\" : \"Bourassi Mohamed\"," +
                                            "\"Age\" : 24," +
                                            "\"Blog\" : \"bourassi_med89@yahoo\"" +
                             "}," + 
                               "\"Date\" : \"31/07/2013\"," +
                               "\"Tags\" : [\"Json\",\"C#\",\".NET\"]" +
                               "}";

            JsonObject jso = JsonObject.Parse(json); 

           // fetch data by key 
            JsonElement element = jso.GetElementByKey("Library"); 
            Console.WriteLine("Library : " + element.Value); 
              Console.WriteLine("---------------------------------------");

              // read data from json array 
              foreach (JsonElement el in jso)     
                 Console.WriteLine(el.Key + " : " + el.Value); 

              Console.ReadKey();
     }   
  }
 }  

Image 1

Example 2

In this example, I'll show you how to create json data, including pairs of simple elements, arrays and objects.

C# Code

C#
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Json;
namespace Test_App
{
    class Program
   { 
       static void Main(string[] args)
       {
           JsonObject jso = new JsonObject();
           jso.Add(new JsonElement(){
               Key = "IntValue", 
               Value = 1
           });
           jso.Add(new JsonElement()
           {
               Key = "BoolValue",
               Value = true
           });
           jso.Add(new JsonElement()
           {
               Key = "StringValue", 
              Value = "string"
           });
           jso.Add(new JsonElement()
           {
               Key = "NullValue",
               Value = null
           });
           JsonObject otherJO = new JsonObject();
           otherJO.Add(new JsonElement() { 
               Key = "Fname",
               Value = "Bourassi"
           });
           otherJO.Add(new JsonElement()
           {
               Key = "Lname",
               Value = "Mohamed"
           });
           otherJO.Add(new JsonElement(){
               Key = "Age",
               Value = 24
           });
           jso.Add(new JsonElement(){ 
               Key = "PersonValue",
               Value = otherJO
           }); 
             
            // Json array
           JsonArray ja = new JsonArray();
           ja.Add("C#");
           ja.Add(null);
           ja.Add(true);
           ja.Add(otherJO);
           jso.Add(new JsonElement()
           {
               Key = "ArrayValue",
               Value = ja
           });
           Console.WriteLine(jso.ToString());

           // output
           /*
            * {
            *     "IntValue" : 1,
            *     "BoolValue" : true,
            *     "StringValue" : "string",
            *     "NullValue" : null,
            *     "PersonValue" : {
            *         "Fname" : "Bourassi",
            *         "Lname" : "Mohamed",
            *         "Age" : 24
            *     },
            *     "ArrayValue" : [
            *         "C#",
            *         null,
            *         True,
            *         {
            *             "Fname" : "Bourassi",
            *             "Lname" : "Mohamed",
            *             "Age" : 24
            *         }
            *      ]
            * }
            * */

           Console.ReadKey();
       }
   }
}

Example 3

In this example, I'll show you how to serialize your objects to json files using class method JsonFormatter.Serialize(object,Stream). This method takes object to be serialized and a Stream object where to put json data.

Note that the generated json data doesn't contain any information about the serialized type, this way you can serialize your object without overhead information.

  • JsonFormatter class doesn't support for now object that contains generic collections, instead you can use simple arrays.
  • Your object's class should have a Serializable attribute in its declaration.
C#
using System; 
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Json;
using System.IO;

namespace Test_App
{
   class Program
   {
       [Serializable]
       class Person
       {
           public string FName { get; set; }
           public string LName { get; set; }
           public int Age { get; set; }
       }

       static void Main(string[] args)
       {
           Person person = new Person()
           {
               FName = "Bourassi",
               LName = "Mohamed",
               Age = 24
           };

           FileStream file = new FileStream("file", FileMode.Create);
           JsonFormatter.Serialize(person, file);
           file.Close();
           string output = File.ReadAllText("file");
           Console.WriteLine(output);

           // output
           /*
            * {
            *     "<FName>k__BackingField" : "Bourassi",
            *     "<LName>k__BackingField" : "Mohamed",
            *     "<Age>k__BackingField"  : 24
            * }
            * */

           Console.ReadKey();
       }
   }
} 

Example 4

In this example, I'll show you how to deserialize your object (how to get them back) from json data using class method JsonFormatter.Deserialize(Type,Stream).
This method takes a Type parameter that represents type of object to get back, and a Stream object, it returns an object that should be converted to your object's type.

Note that in your json data, there is no information about the saved type, this way you can create custom class based on any json file.

C#
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Json;
using System.IO;

namespace Test_App
{
   class Program
   {
       [Serializable]
       class Person
       {
           public string FName { get; set; }
           public string LName { get; set; }
           public int Age { get; set; }
       }

       static void Main(string[] args)
       {
           // JSON File content 
           /*
            * {
            *     "<FName>k__BackingField" : "Bourassi",
            *     "<LName>k__BackingField" : "Mohamed",
            *     "<Age>k__BackingField"  : 24
            * }
            * */

           FileStream file = new FileStream("file", FileMode.Open);
           Person person = (Person)JsonFormatter.Deserialize(typeof(Person), file);
           file.Close();
           Console.WriteLine("First Name : " + person.FName);
           Console.WriteLine("Last Name  : " + person.LName);
           Console.WriteLine("Age        : " + person.Age);
           Console.ReadKey();
       }
   }
} 

Image 2

Hope this will be useful for some of you. Any suggestions and comments are welcome.

Code Source

You can get the package library from here.

License

This article, along with any associated source code and files, is licensed under The Code Project Open License (CPOL)

Share

About the Author

Bourassi Mohamed
Software Developer
Morocco Morocco
Software Architect

Comments and Discussions

 
GeneralMy vote of 1 Pin
Ziad J.khan25-Apr-14 10:22
professionalZiad J.khan25-Apr-14 10:22 
GeneralMy vote of 1 Pin
AlexCode7-Aug-13 23:19
professionalAlexCode7-Aug-13 23:19 
GeneralRe: My vote of 1 Pin
Bourassi Mohamed8-Aug-13 9:23
MemberBourassi Mohamed8-Aug-13 9:23 
GeneralRe: My vote of 1 Pin
AlexCode8-Aug-13 19:18
professionalAlexCode8-Aug-13 19:18 
QuestionWhy not use the .net DataContractJsonSerializer or JavaScriptSerializer? Pin
AlexCode7-Aug-13 21:07
professionalAlexCode7-Aug-13 21:07 
AnswerRe: Why not use the .net DataContractJsonSerializer or JavaScriptSerializer? Pin
Bourassi Mohamed8-Aug-13 10:40
MemberBourassi Mohamed8-Aug-13 10:40 
i tested DatacontractJsonSerializer and JavascriptSerializer and i think my library is fast.
also its simple to use.

Thnks

General General    News News    Suggestion Suggestion    Question Question    Bug Bug    Answer Answer    Joke Joke    Praise Praise    Rant Rant    Admin Admin   

Use Ctrl+Left/Right to switch messages, Ctrl+Up/Down to switch threads, Ctrl+Shift+Left/Right to switch pages.