Extract only JSON from string in C# - c#

I have a requirement in c# to extract the below JSON error message and read the title element.
I need to remove all the characters in the string and I want only starting from errors
i.e
{
"errors":
[{
"status": "404",
"title": "Not found data",
"detail": "This is a sample line of error detail."
}]
}
Please note that the exception can be anything so I just require to extract the JSON message starting from"errors".
Can you please assist me?
Code
string sb="{465F6CE7-3DF9-4BAF-8DD0-3E116CDAC9E7}0xc0c0167a0System.Net.WebException: There was no endpoint listening at http://TestData/member that could accept the message. This is often caused by an incorrect address or SOAP action. See InnerException, if present, for more details.
{ "errors": [ { "status": "404", "title": "Not found data","detail": "This is a sample line of error detail." } ] }";

If you're asking how to extract a specific sequence of text from a random string of text, this sounds like a regular expression.
The lazy mans solution:
If you're just looking to read the title, you could just do IndexOf on "title", and then read to the next quotation mark that's not preceded by a backward-slash.

var pattern = #"\{(\s?)\'errors.*";
string sb = "{465F6CE7-3DF9-4BAF-8DD0-3E116CDAC9E7}0xc0c0167a0System.Net.WebException: There was no endpoint listening at http://TestData/member that could accept the message. This is often caused by an incorrect address or SOAP action. See InnerException, if present, for more details. { 'errors': [ { 'status': '404', 'title': 'Not found data','detail': 'This is a sample line of error detail.' } ] }";
MatchCollection matches = Regex.Matches(sb, pattern);
I have changed the " to ', so just change the pattern to match ".
matches is not an array of all matches matches[0] will give you what you want.

You can use JSON.NET. So, you need to parse your string into JObject i.e.
string sb = #"{ ""errors"": [ { ""status"": ""404"", ""title"": ""Not found data"",""detail"": ""This is a sample line of error detail."" } ] }";
JObject jsonObject = JObject.Parse(sb);
JArray errors = (JArray)jsonObject["errors"];
foreach(var item in errors.Children())
{
int itemStatus = (int)item["status"];
string itemTitle = (string)item["title"];
string itemDetail = (string)item["detail"];
}
So, in this loop you can get what you want i have shown all the elements from the JSON that can be extracted.
Hope this helps you :)

Related

C# OpenApi Json String response

I am trying to print a Json String in OpenAPI response body, however all the escaped characters are printed, so it is not easy readable for the user. Ex: `
{\r\n\t"Name": "xxxx",\r\n\t"Version": "V1",\r\n\t"Platform":
"xxxx",\r\n\t"IsPuppetAgentServiceControllerRequired":
true,\r\n\t"AgentUrl":
"http://www.example.com",\r\n\t"Modules":\r\n\t{\r\n\t\t"module1":\r\n\t\t{\r\n\t\t\t"propertyname1":
"value1",\r\n\t\t\t"propertyname2":
"value2",\r\n\t\t\t"propertyname3": "value3"\r\n\t\t}...
I would like to show something like this:
{
Name: xxxxx,
Version: xxxx,
Module1: {
property: value,
property: value ....
The response is dynamically generated, it doesn't follow a predefined structure, so I can not add it to the scheme. Is there any way to achieve this?
If you have a valid Json string from the API as I commented, If your intention is to just print without escape characters then you could you use the Regex.Unescape
string readText = "<Your json String";
string str = Regex.Unescape(readText);
//OUTPUT
{
"Name": "xxxx",
"Version": "V1",
"Platform": "xxxx",
"IsPuppetAgentServiceControllerRequired": true,
"AgentUrl": "http://www.example.com",
"Modules": {
"module1": {
"propertyname": "value"
}
}
}
The get output you mentioned in your question the use JObject using parse method on escaped string as mentioned above code.
var testStr = JObject.Parse(str);
foreach (var pair in testStr)
{
Console.WriteLine("{0}: {1}", pair.Key, pair.Value);
}
You can try something like
EditedText = JsonText.Replace("\n", '\n');
You can use similar methodology to achieve what you are looking for.

receinv bad json format from service

I get the following: How to make it as a valid JSON?
{{
"id": "123",
"name": "Kaizen",
"living": {
"city": "Sydney",
"state": "NSW"
},
"Country": {
"name": "Australia",
"region": "APAC"
}
}}
It looks like a valid JSON except for the opening and closing bracket.
You can simply cut it out:
string jsonString = yourServerClient.GetData();
jsonString = jsonString.Trim();
jsonString = jsonString.Substring(1, jsonString.Length - 2);
var jsonObj = JsonConvert.DeserializeObject(jsonString);
However, I would recommend you to refuse using any incorrect or invalid data sources - it is the road to hell.
You can never expect what they do next, and you definitely do not want to spend much of your time every time they change their service, and rewrite (and worsen) your code such that it now supports their incorrect format.

Regular expression groups replacement

I'm working on a regular expression and I just can't figure out what the problem is. I've tried several helping sites like http://derekslager.com/blog/posts/2007/09/a-better-dotnet-regular-expression-tester.ashx and http://gskinner.com/RegExr/ but somehow when I put the tested regular expression in c# it is not processed correctly
I'm working on a JSON string I can receive from JIRA. The heavily stripped down and beautified version of this JSON string is as follows:
{
"fields": {
"progress": {
"progress": 0,
"total": 0
},
"summary": "Webhook listener is working",
"timetracking": {},
"resolution": null,
"resolutiondate": null,
"timespent": null,
"reporter": {
"self": "http://removed.com/rest/api/2/user?username=removed",
"name": "removed#nothere.com",
"emailAddress": "removed#nothere.com",
"avatarUrls": {
"16x16": "http://www.gravatar.com/avatar/88994b13ab4916972ff1861f9cccd4ed?d=mm&s=16",
"24x24": "http://www.gravatar.com/avatar/88994b13ab4916972ff1861f9cccd4ed?d=mm&s=24",
"32x32": "http://www.gravatar.com/avatar/88994b13ab4916972ff1861f9cccd4ed?d=mm&s=32",
"48x48": "http://www.gravatar.com/avatar/88994b13ab4916972ff1861f9cccd4ed?d=mm&s=48"
},
"displayName": "Wubinator]",
"active": true
},
"updated": "2013-08-20T14:08:00.247+0200",
"created": "2013-07-30T14:41:07.090+0200",
"description": "Say what?",
"customfield_10001": null,
"duedate": null,
"issuelinks": [],
"customfield_10004": "73",
"worklog": {
"startAt": 0,
"maxResults": 0,
"total": 0,
"worklogs": []
},
"project": {
"self": "http://removed.com/rest/api/2/project/EP",
"id": "10000",
"key": "EP",
"name": "EuroPort+ Suite",
"avatarUrls": {
"16x16": "http://removed.com/secure/projectavatar?size=xsmall&pid=10000&avatarId=10208",
"24x24": "http://removed.com/secure/projectavatar?size=small&pid=10000&avatarId=10208",
"32x32": "http://removed.com/secure/projectavatar?size=medium&pid=10000&avatarId=10208",
"48x48": "http://removed.com/secure/projectavatar?pid=10000&avatarId=10208"
}
},
"customfield_10700": null,
"timeestimate": null,
"lastViewed": null,
"timeoriginalestimate": null,
"customfield_10802": null
}
}
I need to convert this JSON to a XML of course this is not directly possible because of the "16x16", "24x24", "32x32" and "48x48" bits inside the json which would be transformed into <16x16 />, <24x24 />, <32x32 /> and <48x48 /> tags which are invalid tags.
The receiver of the XML doesn't even need those avatar urls so I was thinking about stripping out the entire "avatarUrls":"{ ..... }, bit before handing the json over to JSON.NET for converting.
I was thinking about doing this using a regular expression. After some testing on the mentioned websites I came to the following regular expression:
("avatarUrls)(.*?)("displayName")
The Regex.Replace method should remove all found results instead of the third groep (a.k.a. "displayName")
The website http://derekslager.com/blog/posts/2007/09/a-better-dotnet-regular-expression-tester.ashx shows me the correct groups and find results and says that the mentioned regular expression should be used inside C# is:
#"(""avatarUrls)(.*?)(""displayName"")"
So inside C# I wrote the following:
string expression = #"(""avatarUrls)(.*?)(""displayName"")";
string result = Regex.Replace(json, expression, "$3");
return result;
When I look at the result after the RegexReplace nothing has been replaced. Does anyone see what I did wrong here?
I wouldn't use regular expressions to remove these nodes. I'd instead use JSON .Net to remove the nodes you don't want.
I refer to the quote:
Some people, when confronted with a problem, think “I know, I'll use
regular expressions.” Now they have two problems.
Using the answer found here, you could write:
var jsonObject = (JObject)JsonConvert.DeserializeObject(yourJsonString);
removeFields(jsonObject.Root, new[]{"avatarUrls"});
(Note that I was not sure if you wanted to delete both "avatarUrls" nodes.)
There's an overload of Regex.Replace that takes RegexOptions that you may need to look into. For example, for . to matches every character (instead of every character except \n), you'd need to specify RegexOptions.Singleline. Also, it looks like you're trying to replace every match of #"(""avatarUrls)(.*?)(""displayName"")" with $3 is that intended? You might be better off doing something like this:
var match = Regex.Match(json, pattern, options);
while (match.Success) {
// Do stuff with match.Groups(1)
match = match.NextMatch();
}
However... I'm not really sure that's going to replace it in the source string.
The problem is something completely different:
Inside the following string:
{"16x16":"http://www.gravatar.com/avatar/88994b13ab4916972ff1861f9cccd4ed?d=mm&s=16, "32.32"
There is an '&' the magic symbol that indicates a next parameter is started. Therefor no complete JSON is read and therefor it cannot convert it properly. It also indicates why nothing is being replaced inside the regular expression I used because "displayName" is not inside the string, so nothing matches.

Resolving new lines within a json field

I have been using Json.NET to serialize my objects in memory to json. When I call the following lines of code:
string json = JsonConvert.SerializeObject(template, Formatting.Indented);
System.IO.File.WriteAllText(file, json);
I get the following in a text file:
{
"template": {
"title": "_platform",
"description": "Platform",
"queries": [
{
"query": "// *******************************\n// -- Remove from DurationWindow at the end \n// *******************************\t\n"
}
],
"metadata": ""
}
}
a query is an object I pulled out of the database, that has a string value. When I use xml and write to file (Using XDocument), the new lines in the string (as well as the \t) are properly resolved into tabs and new lines in the file. Is it possible to get the same effect here with json.Net ?
The line-break and tab chars are not valid in JSON values, and JSON.net won't render \t and \n into tab & line break characters actually. To display this nicely, you could do:
var withLineBreaks = json.Replace("\\n", "\n").Replace("\\t", "\t");
However if you do that, the text that you're writing will be invalid JSON, and you'll have to strip out tab and line breaks when you read it back if you want to deserialize it.

How to handle spaces in JSON keys when serializing to XML?

I'm using Json.NET in a .NET 4.0 application in order to convert a JSON RESTful response into XML. I am running into issues converting JSON into XML if a JSON child key has a space.
So far, I am able to convert most JSON responses.
Here are example responses along with the code which I am using to generate the XML.
{
num_reviews: "2",
page_id: "17816",
merchant_id: 7165
}
And here is the response which is causing an error:
[
{
headline: "ant bully",
created_date: "2010/06/12",
merchant_group_id: 10126,
profile_id: 0,
provider_id: 10000,
locale: "en_US",
helpful_score: 1314,
locale_id: 1,
variant: "",
bottomline: "Yes",
name: "Jessie",
page_id: "17816",
review_tags: [
{
Pros: [
"Easy to Learn",
"Engaging Story Line",
"Graphics",
"Good Audio",
"Multiplayer",
"Gameplay"
]
},
{
Describe Yourself: [
"Casual Gamer"
]
},
{
Best Uses: [
"Multiple Players"
]
},
{
Primary use: [
"Personal"
]
}
],
rating: 4,
merchant_id: 7165,
reviewer_type: "Verified Reviewer",
comments: "fun to play"
},
{
headline: "Ok game, but great price!",
created_date: "2010/02/28",
merchant_group_id: 10126,
profile_id: 0,
provider_id: 10000,
locale: "en_US",
helpful_score: 1918,
locale_id: 1,
variant: "",
bottomline: "Yes",
name: "Alleycatsandconmen",
page_id: "17816",
review_tags: [
{
Pros: [
"Easy to Learn",
"Engaging Story Line"
]
},
{
Describe Yourself: [
"Frequent Player"
]
},
{
Primary use: [
"Personal"
]
},
{
Best Uses: [
"Kids"
]
}
],
rating: 3,
merchant_id: 7165,
reviewer_type: "Verified Reviewer",
comments: "This is a cute game for the kids and at a great price. Just don't expect a whole lot."
}
]
So far, I have been considering on creating a mapping of the JSON data to a C# object and generating XML for that class. However, is there a way to keep this dynamic? Or is there a way to treat spaces as %20 encodings?
This question is same as how to validate JSON string before converting to XML in C#
If you have any further queries, please let me know.
You can call XmlConvert.EncodeName, which will escape any invalid characters using _s.
For example, a space would become _x0020_.
You cannot have an XMLElement Name with a space in it. You would need to replace the space with an Underscore or anyother element. If that is not feasible for you, try putting that value as an attribute for that Node.
I hope this makes sense.

Categories