如何查询一些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]
答案 0 :(得分:3)
使用此方法,我们可以创建一个对象来匹配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)+"]");
}
}
答案 2 :(得分:0)
您主题的标签是“如何在json字符串上进行投影”,这是在告诉我们您已经具有要转换为字符串的DataTable。
您提供给我们的代码的意思是“我想将数据表序列化为JSON字符串”。
最后,您甚至需要什么?字符串数组?一个字符串?一个json对象?
如果是字符串,我建议您通过获取数据表并返回STRING而不是JSON来重写DataTable的ToString()方法以获取所需的格式,即[number1,number2,number3]。>
编辑。我认为@ThePerplexedOne已经回答了这个问题。