读取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元素,因此这些元素需要分开。
您可以使用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.
之后地球上速度最快的