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 抽出では、次のようにこれを 1 行の文字列に変換する必要があります。

'20130122','MET-MET-MET-MET-(なし)','1','3857.0'

JSON 出力には多くのレコードがあるため、これを行うには各レコードをループする必要があります。

conversionpathvalue 要素をプリミティブ値要素に個別に連結し、行ごとに結合する最良の方法は何ですか? また、同じ行に複数の conversionpathValue 要素のセットが存在する可能性があるため、これらを分離する必要があります。

4

1 に答える 1

0

Servicestackを使用してこれを行うことができますJsonSerializerServiceStack.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 }

structa を使用して、次のように減らすことができます。

"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.

于 2013-02-05T18:52:35.770 に答える