如何在JSON字符串上进行投影

时间:2019-02-27 09:58:02

标签: c# .net json linq .net-3.5

如何查询一些json以选择特定属性?

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]

3 个答案:

答案 0 :(得分:3)

看看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);

答案 1 :(得分:1)

您甚至不必对所有属性进行反序列化,只需选择一个即可简单地在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;

答案 2 :(得分:0)

您主题的标签是“如何在json字符串上进行投影”,这是在告诉我们您已经具有要转换为字符串的DataTable。

您提供给我们的代码的意思是“我想将数据表序列化为JSON字符串”。

最后,您甚至需要什么?字符串数组?一个字符串?一个json对象?

如果是字符串,我建议您通过获取数据表并返回STRING而不是JSON来重写DataTable的ToString()方法以获取所需的格式,即[number1,number2,number3]。

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