1

私が呼び出しているWebサービスは、実際に使用する必要があるよりもはるかに多くのデータを含むJSON応答を返します。これにより、逆シリアル化プロセスに非常に長い時間がかかります。

VB.NETとNewtonsoftJSONライブラリを使用しています。

次のJSONを例として使用すると、「id」値を除くすべての値を削除するにはどうすればよいですか?

{"results": [
  {"id":"1234", "name":"name value", "logo":"<some base64 encoded string>"},
  {"id":"1234", "name":"name value", "logo":"<some base64 encoded string>"},
  {"id":"1234", "name":"name value", "logo":"<some base64 encoded string>"},
  {"id":"1234", "name":"name value", "logo":"<some base64 encoded string>"},
  {"id":"1234", "name":"name value", "logo":"<some base64 encoded string>"}
]}

正規表現が最善の方法でしょうか?

idまた、プロパティを持つオブジェクトのネストされた配列も処理する必要があることを学びました。ネストされたidプロパティは、最終的なJSONから除外する必要があります。

{"results": [
  {"id":"1234", "name":"name value", "categories":[{"id":"1","name":"category"}]},
  {"id":"1234", "name":"name value", "categories":[{"id":"1","name":"category"}]},
  {"id":"1234", "name":"name value", "categories":[{"id":"1","name":"category"}]},
  {"id":"1234", "name":"name value", "categories":[{"id":"1","name":"category"}]},
  {"id":"1234", "name":"name value", "categories":[{"id":"1","name":"category"}]}
]}
4

2 に答える 2

2

次の式を使用できます

(?<="id":")[0-9]*(?=")

IDを取得し、for/foreachループと。を使用してJSON文字列を作成しますStringBuilder

C#を使用してサンプルの使用法を投稿します。おそらく、VBに適合させることができます。

var json = "{\"results\": [" +
"{\"id\":\"1234\", \"name\":\"name value\", \"logo\":\"<some base64 encoded string>\"}," +
"{\"id\":\"1234\", \"name\":\"name value\", \"logo\":\"<some base64 encoded string>\"}," +
"{\"id\":\"1234\", \"name\":\"name value\", \"logo\":\"<some base64 encoded string>\"}," +
"{\"id\":\"1234\", \"name\":\"name value\", \"logo\":\"<some base64 encoded string>\"}," +
"{\"id\":\"1234\", \"name\":\"name value\", \"logo\":\"<some base64 encoded string>\"}" +
"]}";

//try to get matches when JSON contains categories
MatchCollection matches = Regex.Matches(json, "(?<=\"id\":\")[0-9]*(?=\", \"name\":\".*\", \"categories\")");

//if no matches are present (i.e. categories are not included in the JSON)
if(matches.Count==0)
    matches = Regex.Matches(json, "(?<=\"id\":\")[0-9]*(?=\")");

StringBuilder sBuilder = new StringBuilder();
sBuilder.Append("{\"results\": [");

for (int i = 0; i < matches.Count; i++)
{
    sBuilder.Append("{\"id\":\"");
    sBuilder.Append(matches[i].Value);
    if (i == matches.Count - 1)
        break;
    sBuilder.Append("\"},");
}

sBuilder.Append("\"}]}");

//use the JSON string
//sBuilder.ToString();
于 2012-12-13T08:18:25.450 に答える
1

ここで説明するように、JSONは正規言語ではないため、正規表現を使用することは、目標を達成するための最良の方法ではありません(ただし、実行できる可能性があります)。そのような操作にはパーサーを使用する方がはるかに優れています。

JSON.NETを使用すると、アイテムを選択するために、次のようなことができると思います。

var ids = response["results"].Children()["id"]
于 2012-12-13T08:28:26.873 に答える