读取JSON时,将一些节点值连接到字符串中,而另一些则以逗号分隔

本文关键字:分隔 连接 JSON 节点 读取 字符串 | 更新日期: 2023-09-27 17:57:41

我有以下JSON中的示例记录,使用C#,我需要将其转换为逗号分隔的字符串。如果节点是"primitiveValue",它将以逗号分隔,但如果节点是"conversionPathValue",我需要将子代的"nodeValue"值连接在一起。

  [
   {
    "primitiveValue": "20130122"
   },
   {
    "conversionPathValue": [
     {
      "interactionType": "CLICK",
      "nodeValue": "MET"
     },
     {
      "interactionType": "CLICK",
      "nodeValue": "MET"
     },
     {
      "interactionType": "CLICK",
      "nodeValue": "MET"
     },
     {
      "interactionType": "CLICK",
      "nodeValue": "MET"
     },
     {
      "nodeValue": "(none)"
     }
    ]
   },
   {
    "primitiveValue": "1"
   },
   {
    "primitiveValue": "3857.0"
   }
  ]

对于上面的JSON提取,我需要将其转换为一行字符串,如下所示:

'20130122','MET-MET-MET-MET-(无)','1','3857.0'

JSON输出有很多记录,所以我需要循环遍历每个记录来完成这项工作。

将conversionpathvalue元素分别连接到primitiveValue元素并按行连接在一起的最佳方法是什么?此外,同一行中可能有多组conversionpathValue元素,因此这些元素需要分开。

读取JSON时,将一些节点值连接到字符串中,而另一些则以逗号分隔

您可以使用Servicestack的JsonSerializer来完成此操作。ServiceStack.Text是一个独立的、无依赖性的序列化库,包含ServiceStack的所有文本处理功能,包括:

    1.  JsonSerializer
    2.  TypeSerializer (JSV-Format)
    3.  CsvSerializer
    4.  T.Dump extension method
    5.  StringExtensions - Xml/Json/Csv/Url encoding, BaseConvert, etc.
    6.  Stream, Reflection, List, DateTime, etc extensions and utils

使用结构自定义JSON

这使得可以自定义序列化例程,并提供更紧凑的有线格式。

例如,不使用JSON对象来表示点

{ Width=20, Height=10 }

您可以使用struct并将其简化为:

"20x10" 

通过覆盖ToString()并提供static Size ParseJson()方法:

public struct Size
{
    public double Width { get; set; }
    public double Height { get; set; }
    public override string ToString()
    {
        return Width + "x" + Height;
    }
    public static Size ParseJson(string json)
    {
        var size = json.Split('x');
        return new Size { 
            Width = double.Parse(size[0]), 
            Height = double.Parse(size[1]) 
        };
    }
}

这会将其更改为更紧凑的JSON输出:

new Size { Width = 20, Height = 10 }.ToJson() // = "20x10"

这允许您以相同的方式反序列化它:

var size = "20x10".FromJson<Size>(); 

使用自定义IEnumerable类序列化JSON数组

除了使用Struct之外,您还可以选择使用自定义C# IEnumerable类型来为JSON数组提供强类型包装:

public class Point : IEnumerable
{
    double[] points = new double[2];
    public double X 
    {
        get { return points[0]; }
        set { points[0] = value; }
    }

  public double Y
    {
        get { return points[1]; }
        set { points[1] = value; }
    }
    public IEnumerator GetEnumerator()
    {
        foreach (var point in points) 
            yield return point;
    }
}
Which serializes the Point into a compact JSON array:
new Point { X = 1, Y = 2 }.ToJson() // = [1,2]

希望你能把这个作为参考来完成你的任务。需要注意的最重要的一点是,Servicestack's JsonSerializer是继protocol-buffers.之后地球上速度最快的