我在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元素集,因此需要将它们分开。
答案 0 :(得分:0)
您可以使用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
使用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 JsonSerializer
是protocol-buffers.