ZZZSharePoint
ZZZSharePoint

Reputation: 1361

Splitting of values in a JSON array

I have my json ["[\"~:bbl:P5085\",\"~:cosco:NoTag\"]"] coming in

options.Type1.Values()

I am trying to keep only the values coming with bbl so from above I want to keep P5085 and remove all, there can be multiple bbl values in here and I need to keep all. I tried the below code but its not working. The splitting gives me

P5085","~:cosco

I dont understand what wrong am i doing in below code. Can someone provide the fix here?

private void InitializePayload(JsonTranslatorOptions options)
        {
            _payload.Add("ubsub:attributes", _attributes);
            _payload.Add("ubsub:relations", _relations);
            JArray newType = new JArray();
            foreach (JValue elem in options.Type1.Values())
            {
                if (elem.ToString().Contains("rdl"))
                {
                    string val = elem.ToString().Split(":")[1];
                    newType.Add(val);
                }                   
               
            }           
            _payload.Add("ubsub:type", newType);
        }

Upvotes: 0

Views: 1747

Answers (2)

Dimitris Grevenos
Dimitris Grevenos

Reputation: 71

Try this:

var input = "['[\"~:bbl:P5085\",\"~:cosco:NoTag\"]']";

var BBLs_List = JArray.Parse(input)
                      .SelectMany(m => JArray.Parse(m.ToString()))
                      .Select(s => s.ToString().Split(":"))
                      .Where(w => w[1] == "bbl")
                      .Select(s => s[2])
                      .ToList();

Upvotes: 2

Panagiotis Kanavos
Panagiotis Kanavos

Reputation: 131641

As I explain in the comments this isn't JSON, except at the top level which is an array with a single string value. That specific string could be parsed as a JSON array itself, but its values can't be handled as JSON in any way. They're just strings.

While you could try parsing and splitting that string, it would be a lot safer to find the actual specification of that format and write a parser for it. Or find a library for that API.

You could use the following code for parsing, but it's slow, not very readable and based on assumptions that can easily break - what happens if a value contains a colon?

foreach(var longString in JArray.Parse(input))
{
   foreach(var smallString in JArray.Parse(longString))
   {
      var values=smallString.Split(":");
      if(values[1]=="bbl")
      {
          return values[2];
      }
   }
}
return null;

You could convert that to LINQ, but that would be just as hard to read :

var value=JArray.Parse(input)
                .SelectMany(longString=>JArray.Parse(longString))
                .Select(smallString=>smallString.Split(":"))
                .Where(values=>values[1]=="bbl")
                .Select(values=>values[2])
                .FirstOrDefault();

Upvotes: 0

Related Questions