3

I Have the following text from a file:

{"players":[{"i":11,"p":0,"a":3186,"n":"IanHx","f":1,"ps":0,"pd":0,"bc":0},{"i":12,"p":0,"a":115,"n":"LoZtamnik","f":1,"ps":0,"pd":0,"bc":0},{"i":58,"p":0,"a":156,"n":"Mr701","f":2,"ps":0,"pd":0,"bc":0},{"i":59,"p":0,"a":156,"n":"B0NE4","f":2,"ps":0,"pd":0,"bc":0},{"i":64,"p":0,"a":324,"n":"5teveJ","f":1,"ps":0,"pd":0,"bc":0}],[.......

What i am trying to do is parse the text, to end up with a array for each bit of data between {...}

so final result would look like:

i=11
p=0
a=3186
n=IanHx
f=1
ps=0
pd=0
bc=0

then i can store these in a database

so far i have something like this:

string contents = System.IO.File.ReadAllText("local text file"); //load string contents with text file
Regex regex1 = new Regex("\"players\":\\[(?<players>.*)\\]"); //find the players section "players":[.......]
Match match1 = regex1.Match(contents); //load match1    
Regex regex2 = new Regex("{(?<player>([^}]*))}"); // then break down each player {....}
MatchCollection match2 = regex2.Matches(match1.Groups["players"].Value); //load match2 with each player

then i get stuck trying to split the match string[] somehow and looking at it may be overcomplicating it?

any pointer to an easier solution to the data parsing

Thanks

1
  • 3
    Ditch the regex. What you have there is JSON. newtonsoft.com/json Commented May 31, 2015 at 18:16

2 Answers 2

4

Your far better off trying to deserialize this with Json.Net from NuGet

Define some classes to match your file structure:

public class Root
{
    public List<Something> players {get; set;}
}

public class Something
{
    public string i {get; set;}
    public string p {get; set;}
    public string a {get; set;}
    public string n {get; set;}
    public string f {get; set;}
    public string ps {get; set;}
    public string pd {get; set;}
    public string bc {get; set;}
}

use Json.Net to crunch:

var json = @"{""players"":[{""i"":11,""p"":0,""a"":3186,""n"":""IanHx"",""f"":1,""ps"":0,""pd"":0,""bc"":0},{""i"":12,""p"":0,""a"":115,""n"":""LoZtamnik"",""f"":1,""ps"":0,""pd"":0,""bc"":0},{""i"":58,""p"":0,""a"":156,""n"":""Mr701"",""f"":2,""ps"":0,""pd"":0,""bc"":0},{""i"":59,""p"":0,""a"":156,""n"":""B0NE4"",""f"":2,""ps"":0,""pd"":0,""bc"":0},{""i"":64,""p"":0,""a"":324,""n"":""5teveJ"",""f"":1,""ps"":0,""pd"":0,""bc"":0}]}";

var data = JsonConvert.DeserializeObject<Root>(json);
Sign up to request clarification or add additional context in comments.

Comments

3

The data contained in your file are in JSON format. JSON is quite simple to read, if formatted correctly. If I reformat your input the structure becomes clearer:

{
  "players": [
    {
      "i": 11,
      "p": 0,
      "a": 3186,
      "n": "IanHx",
      "f": 1,
      "ps": 0,
      "pd": 0,
      "bc": 0
    },
    {
      "i": 12,
      "p": 0,
      "a": 115,
      "n": "LoZtamnik",
      "f": 1,
      "ps": 0,
      "pd": 0,
      "bc": 0
    },
    {
      "i": 58,
      "p": 0,
      "a": 156,
      "n": "Mr701",
      "f": 2,
      "ps": 0,
      "pd": 0,
      "bc": 0
    },
    {
      "i": 59,
      "p": 0,
      "a": 156,
      "n": "B0NE4",
      "f": 2,
      "ps": 0,
      "pd": 0,
      "bc": 0
    },
    {
      "i": 64,
      "p": 0,
      "a": 324,
      "n": "5teveJ",
      "f": 1,
      "ps": 0,
      "pd": 0,
      "bc": 0
    }
  ]
}

In JSON, anything enclosed in [ ] denotes a collection and anything enclosed in { } denotes an object. So, you can see that you have a collection called players which contains 5 objects (since there are 5 pairs of { } within players [ ]) with 8 properties each. If you think of these in C# terms, you would have a class called Player with those 8 properties, and a List<Player> to hold each Player instance. You could then take the JSON data and deserialize them into their C# counterparts so you can manipulate them as you see fit, as Dave Bish has pointed out in his answer.

There's a very easy way to create the C# classes from your JSON data automatically:

  • Create a new class in your project, name it however you want and clear all of it's content
  • Copy the JSON data (either from my example or yours)
  • Go back to the class and click Edit -> Paste Special -> Paste JSON As Classes

Voila. Visual Studio's got your back. You should now see something along these lines:

public class Rootobject
{
    public Player[] players { get; set; }
}

public class Player
{
    public int i { get; set; }
    public int p { get; set; }
    public int a { get; set; }
    public string n { get; set; }
    public int f { get; set; }
    public int ps { get; set; }
    public int pd { get; set; }
    public int bc { get; set; }
}

You can then do whatever suits your scenario best, e.g. add the System.Collections.Generic namespace so you can make Player[] a List<Player> instead so on.

Now, to manipulate the JSON data and deserialize them into the C# class we've just created, you can use the excellent Json.NET library. To add it, right click your application from the solution explorer and click "Manage NuGet Packages...". Type "Json.NET" in the search box and install it.

Once you have that in place, add the Newtonsoft.Json namespace and you're good to go. You can now use Json.NET's DeserializeObject<T>() method to deserialize the JSON data into the C# classes we've created:

//i've hardcoded the JSON data here, obviously you would extract them from your file
var jsonData = @"{""players"":[{""i"":11,""p"":0,""a"":3186,""n"":""IanHx"",""f"":1,""ps"":0,""pd"":0,""bc"":0},{""i"":12,""p"":0,""a"":115,""n"":""LoZtamnik"",""f"":1,""ps"":0,""pd"":0,""bc"":0},{""i"":58,""p"":0,""a"":156,""n"":""Mr701"",""f"":2,""ps"":0,""pd"":0,""bc"":0},{""i"":59,""p"":0,""a"":156,""n"":""B0NE4"",""f"":2,""ps"":0,""pd"":0,""bc"":0},{""i"":64,""p"":0,""a"":324,""n"":""5teveJ"",""f"":1,""ps"":0,""pd"":0,""bc"":0}]}";

//deserialize the JSON into the C# class we created and store it in myPlayerData
var myPlayerData = JsonConvert.DeserializeObject<Rootobject>(jsonData);

//you can now do stuff such as..
foreach(Player player in myPlayerData.players)
{
    MessageBox.Show(string.Format("Player {0} has an i of {1} and an a of {2}", player.n, player.i, player.a));
}

2 Comments

The original text had some non json? bits so i trimmed them off with ( sorry back to a bit of regex ) Regex regex = new Regex("ccmapData = ({.*}]),\"timestamp\""); Match match = regex.Match(json); var data = JsonConvert.DeserializeObject<Root>(match.Groups[1].Value + "}"); and it works a treat Many Thanks.
In your sample data you had ,[....... at the end so I assumed you meant that you omitted parts of it for brevity. No problem, glad I could help.

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.