在c#中读取JSON - 将一些节点值连接成字符串,其他节点以逗号分隔

时间:2013-02-05 18:28:34

标签: c# json

我在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输出有很多记录,所以我需要循环遍历每条记录才能执行此操作。

将转换路径值元素单独连接到primitiveValue元素并将每行连接在一起的最佳方法是什么?此外,同一行中可能有多个conversionpathValue元素集,因此需要将它们分开。

1 个答案:

答案 0 :(得分: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

使用Structs自定义JSON

这样就可以自定义序列化例程并提供更紧凑的线格式。

E.g。而不是使用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 JsonSerializerprotocol-buffers.

之后地球上最快的{{1}}