0

我在 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 元素,因此需要将它们分开。

4

1 回答 1

0

您可以使用ServicestackJsonSerializer. 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 }

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

"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 数组

除了使用 a 之外,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.

于 2013-02-05T18:52:35.770 回答