Reputation: 1201
Feels like there is a one-two row solution for what I want to do: Parse a string like this:
"{\"postalcode\":\"12345\",\"postalcity\":\"SOME-CITY\",\"country\":\"UK\",\"box\":false}"
Into something like this:
string[] result = { "12345", "SOME-CITY", "UK", "false" };
Whats the simplest way to do this?
Upvotes: 8
Views: 89022
Reputation: 61
I just ran into a similar rabbit hole. This helped me with out any other .dll installs. Hope this helps someone.
using System.Text.Json.Nodes;
public static string cSettings = AppDomain.CurrentDomain.BaseDirectory + @"\Application_Settings.json";
public static void Read_JSON()
{
string read = File.ReadAllText(cSettings);
var jsonObject = JsonNode.Parse(read);
var appname = jsonObject["appname"];
MessageBox.Show(appname.ToString());
}
//output: my test app
Application_Settings.json
{
"appname": "my test app",
"version": "1.0.003",
"id": null,
"firstrun": null,
"firstname": "t",
"lastname": "t",
"email": "[email protected]",
"cpu1id": "F00A20F10",
"cpu1key": null,
"gamingpc": false
}
Link to where I found this reference.
I'm using Visual Studio 2022 C#
Upvotes: 0
Reputation: 16296
It looks like your input string is a JSON string, for which you can use a JSON deserializer if you want. If not you can use regular-expression along with named-groups as the following:
List<string> values = new List<string>();
List<string> keys= new List<string>();
string pattern = @"\""(?<key>[^\""]+)\""\:\""?(?<value>[^\"",}]+)\""?\,?";
foreach(Match m in Regex.Matches(input, pattern))
{
if (m.Success)
{
values.Add(m.Groups["value"].Value);
keys.Add(m.Groups["key"].Value);
}
}
var result = values.ToArray();
Named groups in regular-expression are indicated by (?<group-name>pattern)
. In the above pattern we have two named groups: key
, and value
which can be grabbed from the Match
object using the Groups
indexer.
Upvotes: 4
Reputation: 116188
string json = "{\"postalcode\":\"12345\",\"postalcity\":\"SOME-CITY\",\"country\":\"UK\",\"box\":false}";
var dict = new JavaScriptSerializer().Deserialize<Dictionary<string,object>>(json);
var postalCode = dict["postalcode"];
//Array is also possible
string[] result = dict.Select(kv => kv.Value.ToString()).ToArray();
Upvotes: 23
Reputation: 761
You could also use newtonsoft : http://james.newtonking.com/pages/json-net.aspx
string json = @"{
""Name"": ""Apple"",
""Expiry"": new Date(1230422400000),
""Price"": 3.99,
""Sizes"": [
""Small"",
""Medium"",
""Large""
]
}";
JObject o = JObject.Parse(json);
string name = (string)o["Name"];
// Apple
JArray sizes = (JArray)o["Sizes"];
string smallest = (string)sizes[0];
// Small
I found another related post : JSON to string array in C#
Lib : http://msdn.microsoft.com/en-us/library/system.web.script.serialization.javascriptserializer.aspx
Upvotes: 8
Reputation: 82136
You could use JavaScriptSerializer to serialize the json into a dynamic
object which would allow you to access the properties via name e.g.
var address = new JavaScriptSerializer().Deserialize<dynamic>(json);
Console.WriteLine(address["postalcode"]);
Upvotes: 3