如何对 json 字符串进行投影

How to do a projection on json string

如何查询一些json到select一个特定的属性?

EX:如果我有这样的 Json obj :

[
   {
      "grd_symbol":"A+",
      "count":21.23,
      "code":4,
      "name":"X",
      "batch_no":760
   },
   {
      "grd_symbol":"A ",
      "count":11.93,
      "code":4,
      "name":"X",
      "batch_no":760
   },
   {
      "grd_symbol":"A-",
      "count":8.49,
      "code":4,
      "name":"X",
      "batch_no":760
   }
]

这是 :

的输出
string JsonObj =  Converter.ConvertDataTabletoString(DT);



public static string ConvertDataTabletoString(DataTable dt)
    {

        System.Web.Script.Serialization.JavaScriptSerializer serializer = new System.Web.Script.Serialization.JavaScriptSerializer();
        List<Dictionary<string, object>> rows = new List<Dictionary<string, object>>();
        Dictionary<string, object> row;
        foreach (DataRow dr in dt.Rows)
        {
            row = new Dictionary<string, object>();
            foreach (DataColumn col in dt.Columns)
            {
                row.Add(col.ColumnName, dr[col]);
            }
            rows.Add(row);
        }
        return serializer.Serialize(rows);
    }

现在我只想得到count,结果是这样的:

[21.23,11.93,8.49]

看看Newtonsoft.JSON

使用这个,我们可以创建一个对象来匹配 json 字符串:

public class MyCustomObject 
{
    [JsonProperty("grd_symbol")] public string GridSymbol {get; set;}
    [JsonProperty("count")] public double Count {get; set;}
    [JsonProperty("code")] public int Code {get; set;}
    [JsonProperty("name")] public string Name {get; set;}
    [JsonProperty("batch_no")] public int BatchNumber {get; set;}
}

然后你可以使用上面提到的库反序列化你的json:

var myData = JsonConvert.DeserializeObject<MyCustomObject[]>(jsonString);

然后,由于您需要一个计数数组,您可以使用 LINQ 使用 Select:

获取它们
var countArray = myData.Select(x => x.Count);

当然,如果你想将其输出为字符串,你可以再次序列化它:

var countString = JsonConvert.SerializeObject(countArray);

您甚至不必将所有 属性 反序列化为 select,您只需在 calss 定义中省略不需要的一个,这样它们就会被忽略。

使用:

public class SimplifyRootObject
{
    public double count { get; set; }
}

而不是:

public class RootObject
{
    public string grd_symbol { get; set; }
    public double count { get; set; }
    public int code { get; set; }
    public string name { get; set; }
    public int batch_no { get; set; }
}

然后一个简单的 string.Join() 添加逗号就可以了。

$"[{string.Join("_separator_", myListOfDouble)}]"

MCVE:

public static void Main(string[] args)
{
    string input = @"[
   {
      ""grd_symbol"":""A+"",
      ""count"":21.23,
      ""code"":4,
      ""name"":""X"",
      ""batch_no"":760
   },
   {
      ""grd_symbol"":""A "",
      ""count"":11.93,
      ""code"":4,
      ""name"":""X"",
      ""batch_no"":760
   },
   {
      ""grd_symbol"":""A-"",
      ""count"":8.49,
      ""code"":4,
      ""name"":""X"",
      ""batch_no"":760
   }
]";
    // Deserialize All, select the wanted.
    var m = JsonConvert.DeserializeObject<List<RootObject>>(input);            
    var result = m.Select(x=> x.count);
    Console.WriteLine("["+string.Join(", ", result)+"]");


    // Deserialize only one, select it.
    var m2 = JsonConvert.DeserializeObject<List<SimplifyRootObject>>(input);            
    var result2 = m.Select(x=> x.count);
    Console.WriteLine("["+string.Join(", ", result2)+"]");

    }
}

https://rextester.com/PFJZN10272

您的主题标签是 "how to do a projection on json string",您告诉我们您已经有一个要转换为字符串的 DataTable。

您给我们的代码表示 "I want to serialize my datatable into a JSON string"。

最后,你还需要什么?字符串数组?一个字符串?一个 json 对象 ?

如果它是一个字符串,我建议您覆盖 DataTable 的 ToString() 方法以获取您想要的格式,即 [number1, number2, number3] 通过获取数据表并返回一个 STRING 而不是 JSON.

编辑。我想@ThePerplexedOne 已经回答了这个问题。