2015-09-16 4 views
0

Итак, я использовал JSON для сериализации списка объектов из C# для отправки в JS. Список, кажется, прибывает в браузер, но я не могу понять, как правильно его использовать. Имеет смысл, что то, что приходит, является строкой, но, похоже, это массив ... Я не уверен, и я не могу понять, как его использовать.Parse JSON string/array в объекты JS

Вот мой JS

var data; 
function testFunc() { 
    d3.select("#stuff").append("h2").text(data[0].source); 
} 

Когда я посылаю один объект вышеприведенного JS печатает значение правильно. Вот что C#

protected void btnTest_Click(object sender, EventArgs e) 
     { 
      string json = JsonConvert.SerializeObject(new testClass(66,77)); 
      ClientScript.RegisterArrayDeclaration("data", json); 
      ScriptManager.RegisterStartupScript(this.Page, Page.GetType(), "id", "testFunc()", true); 
     } 

Когда я смотрю на отладчике браузера я вижу эту строку ниже, когда выше выполняется:

var data = new Array({"target":66,"source":77}); 

Это то, что позволяет мне печатать значение 77 в JS выше

Досадно, что я хочу отправить список этого одного и того же объекта. Поэтому я использую следующую C#

List<TestGraph.Models.testClass> L = new List<TestGraph.Models.testClass>() 
private List<testClass> fill() 
     { 

      for (int i = 0; i < 10; i++) 
      { 
       L.Add(new testClass(i, i+1)); 
      } 
      return L; 
     } 
     protected void btnTest_Click(object sender, EventArgs e) 
     { 
      fill(); 
      string json = JsonConvert.SerializeObject(L); 
      ClientScript.RegisterArrayDeclaration("data", json); 
      ScriptManager.RegisterStartupScript(this.Page, Page.GetType(), "id", "testFunc()", true); 
     } 

Когда я использую те же JS не напечатает что-нибудь, однако список становится в JS, потому что я вижу ниже, когда я смотрю на отладчике браузера:

var data = new Array([{"target":0,"source":1},{"target":1,"source":2},{"target":2,"source":3},{"target":3,"source":4},{"target":4,"source":5},{"target":5,"source":6},{"target":6,"source":7},{"target":7,"source":8},{"target":8,"source":9},{"target":9,"source":10}]); 

Так как список данных в браузере, как я могу его использовать?

PS Не очень нужно, но вот мой TestClass если кому-то интересно

public class testClass 
    { 
     public int target { get; set; } 
     public int source { get; set; } 
     public testClass(int t, int s) 
     { 
      target = t; 
      source = s; 
     } 
     public testClass() 
     { 

     } 
    } 

EDIT

Для тех, предполагая, я попытался с помощью JSON.синтаксический анализ (данные)

Я использовал это:

var data; 
var data2 = JSON.parse(data); 
function testFunc() { 
    d3.select("#stuff").append("h2").text(data2[1].source); 
} 

РЕДАКТИРОВАТЬ

Так что, когда я шаг через C# линии:

JsonConvert.SerializeObject(L); 

помещает следующую строку в JSON var:

"[{\"target\":0,\"source\":1},{\"target\":1,\"source\":2},{\"target\":2,\"source\":3},{\"target\":3,\"source\":4},{\"target\":4,\"source\":5},{\"target\":5,\"source\":6},{\"target\":6,\"source\":7},{\"target\":7,\"source\":8},{\"target\":8,\"source\":9},{\"target\":9,\"source\":10}]" 

Тогда в теории, когда я звоню:

ClientScript.RegisterArrayDeclaration("data", json); 

он должен поставить выше строку в вар «данные» в JS, однако, когда я делаю предупреждение о нем, как, например:

var data; 
function testFunc() { 
    alert(data); 
} 

Что появляющийся

[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object] 

Я также попробовал другой метод в моей C#:

protected void btnTest_Click(object sender, EventArgs e) 
     { 
      fill(); 
      string json = JsonConvert.SerializeObject(L); 
      Response.Write(string.Concat("<input id='data' type='hidden' value='", json, "' />")); 
      ScriptManager.RegisterStartupScript(this.Page, Page.GetType(), "id", "testFunc()", true); 
     } 

Какие необходимы следующие изменения к JS

var field = document.getElementById('data'); 
var data = JSON.parse(field.value); 
function testFunc() { 
    alert(data); 
} 

Когда я попробовать этот новый метод я получаю то же самое, как и раньше:

[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object] 

И я сделал второе испытание на поле вар из метод выше и получил

[object HTMLInputElement] 
+0

добавьте ваш образец JSON –

+0

'уаг данных = новый Array ([{ "цель": 0, "источник": 1}, { "цель": 1, "источник" : 2}, { "мишень": 2, "источник": 3}, { "мишень": 3, "источник": 4}, { "мишень": 4, "источник": 5}, { "мишень" : 5, "источник": 6}, { "цель": 6, "источник": 7}, { "цель": 7, "источник": 8}, { "мишень": 8, "источник": 9 }, {"target": 9, "source": 10}]); 'представляет собой массив объектов в другом бессмысленном массиве, поскольку' var ary = [] 'такой же, как' var ary = new Array() ' , – PHPglue

+0

@PHPglue Я вижу это, но я этого не писал. Это просто в моем отладчике браузера. Это то, что отправлено в браузер. – nhoughto

ответ

2

просто использовать JSON.parse()

, например:

var parsed = JSON.parse('[{"target":0,"source":1},{"target":1,"source":2},{"target":2,"source":3},{"target":3,"source":4},{"target":4,"source":5},{"target":5,"source":6},{"target":6,"source":7},{"target":7,"source":8},{"target":8,"source":9},{"target":9,"source":10}]'); 
    console.log(parsed[1].target);