Tag Archives: JSON

How to delete field inside Json Object – 如何把Json 的屬性移除

今日在公司經過同事Code Review…我學會了很多東西
其中一個就是如何delete Json/ Javascript Object 內的一些Field

e.g.

var params = {
        UserId: membership.id,
        FirstName: membership.firstName,
        ScreenName: membership.nickname,
        location: membership.currentLocation
      };

假設只有某些權限的用戶才可以看到 location這個field的

我們可以使用 delete keyword 來把Json / Javascript object的 field 移除
e.g.

delete params.location;
console.log(params);

Hope you find it useful

PHP Create Json Object/String 如何使用PHP 來建立 Json Object/String

有時候有一些API / Web Service 需要 pass 一些JSON string 變數
那麼怎樣可以在PHP 來建立 Json Object/String

解決方法十分簡單
我們可以把Json Objectproperty/屬性 以Array Object 的方法來建立
E.G.

    
//定義變數
$subValue1= 'subValue1';
    $subValue2= 2;
    
//建立 Array Object
    $jsonVariable = array(
        'arrayProperty1' => array(
            'subProperty1' => $subValue1,
            'subProperty2' => $subValue2
        ),
        'property1' => 'value1'
    );

            
 //之後我們可以使用 json_encode 來把這個array object轉成 Json String
 echo json_encode($jsonVariable);

從前的我可能會用string concatenation 的做法 <–絕對不建議使用這個方法 [反面教材]
e.g.

$jsonVar = '{"arrayProperty1":{"' . $subProperty1. '":"subValue1","'.subProperty2.'":2},"property1":"value1"} ';

Hope you find it useful

Error during serialization or deserialization using the JSON JavaScriptSerializer. The length of the string exceeds the value set on the maxJsonLength property.

今天嘗試便用 JavaScriptSerializer 把公司一個資料庫的資料轉成 Json 放在公司的另一個程式上做Performance Test的時候出現以下的錯誤信

An unhandled exception of type ‘System.InvalidOperationException’ occurred in System.Web.Extensions.dll

Additional information: Error during serialization or deserialization using the JSON JavaScriptSerializer. The length of the string exceeds the value set on the maxJsonLength property.
Error during serialization or deserialization using the JSON JavaScriptSerializer. The length of the string exceeds the value set on the maxJsonLength property.

原因是因為我有太多資料..而預設的Json 字串大小是2097152個字元… 我的數據..文字比較多..
便所以出現這個錯誤信息..
解決方法 十分簡單..只是把 SerializerMaxJsonLength 的值比你的 資料更大便可以了

解決方法:

E.G.

// 建立 JavascriptSerializer Object
System.Web.Script.Serialization.JavaScriptSerializer serializer = new System.Web.Script.Serialization.JavaScriptSerializer();
// 查看 JavascriptSerializer Object的 Default MaxJsonLength 是什麼
Console.WriteLine("Default MaxJsonLength value: " + serializer.MaxJsonLength.ToString());
// 更新 JavascriptSerializer Object的 MaxJsonLength 大小... 為Integer的最大值..因為他是Int32的 DataType
serializer.MaxJsonLength = Int32.MaxValue;
Console.WriteLine("Updated MaxJsonLength value: " + serializer.MaxJsonLength.ToString());

這應該可以解決這個問題

Hope you find it useful

.Net Consume RESTFUL Services Part 2 .Net Convert Stream to String/ .Net Convert ByteArray to String

為了方便測試在RESTFUL Call 的Return的結果
所以我想看看有沒有方法把這個Response Stream轉換成String

完來解決方法十分簡單…
只是使用StreamReader 使用 ReadToEnd 的方法 (ReadLine,ReadBlockRead 也可以的. ReadToEnd比較方便)把 Stream讀取出來便可以了

解決方法

我用了上一次的Sample在這裡做了個示範

有興趣的朋友可以按以下連結看看
.Net Consume RESTFUL Services – Make Restful Services Call and Handle JSON reponse

在這裡我只更新OpenReadCompletedEventHandler 這個Section 示範這個結果

  void wc_OpenReadCompleted(object sender, OpenReadCompletedEventArgs e)
        {
            if (e.Error == null)
            {
//建立新的StreamReader把 WebClient OpenReadCompleted的Stream Assign 到Stream Reader上
                StreamReader reader = new StreamReader(e.Result);
//使用StreamReader的ReadToEnd 來讀取在這個Stream上的內容
                string result = reader.ReadToEnd();
//用MessageBox.Show 來顯示結果
                MessageBox.Show(result);
	}
}

Hope you find it useful

.Net Consume RESTFUL Services – Make Restful Services Call and Handle JSON reponse

過2星期又有一個Charity Hack Day
所以希望好好用這兩個星期 去好好練習自己的Programming
很多時候Hack Day都是會用到其他公司的API
現在有很多時候都會是使用RESTFUL services的…

今天用的Example使用了Twitter APIGeo Search ..
因為他不用使用API Key
這樣我們便可以更方便的示範怎樣可以在.Net 上 使用WebClient 去 Call一個Restful Service
和當Restful Service 回覆JSON 的資料是怎樣把他們轉換成Object 令到更容易使用

我們會用到這個URL
https://api.twitter.com/1/geo/search.json?query=hong%20kong
在瀏覽器上輸入了這個URL 之後便會出現和下面相似的結果

{"result":{"places":[{"contained_within":[],"name":"Hong Kong","full_name":"Hong Kong","attributes":{},"bounding_box":null,"url":"http:\/

\/api.twitter.com\/1\/geo\/id\/35fd5bacecc4c6e5.json","place_type":"country","id":"35fd5bacecc4c6e5","country_code":"HK","country":"Hong 

Kong"}]},"query":{"type":"search","params":{"autocomplete":false,"query":"hong 

kong","granularity":"neighborhood","accuracy":0,"trim_place":false},"url":"http:\/\/api.twitter.com\/1\/geo\/search.json?

autocomplete=false&amp;query=hong+kong&amp;accuracy=0&amp;granularity=neighborhood&amp;trim_place=false"}}

在.Net上怎樣可以把以上的結果轉成Object呢 和怎樣呼叫這個RestFul services

解決方法:

我們可以使用WebClient這個類
在我們的Project上可以建立一個新的WebClient Object

E.G.
之後設定OpenReadCompletedEventHandler //這個是當Web Server有回覆時會呼叫的功能
傳回來的資料會以Stream 的方式存在

我們要以上邊的JSON Response 建立一些Object方便我們之後取資料時使用
由於這個Restful Service回的是JSON 所以我們會使用到DataContractJsonSerializer 把這個Stream 轉換成Object

以下是

Sample Code
Twitter Object
以下是我以上面的 JSON Result而建立的 Twitter Reponse Object..
為了方便..我沒有填上所有的Properties.. 當大家有不明的的時候歡迎留言給我

     public class TwitterResponse
     {
         public TwitterGeoSearchResult result { get; set; }
     }

     public class TwitterGeoSearchResult
     {
         public List<TwitterPlace> places { get; set; }
     }

     public class TwitterPlace
     {
         public string name { get; set; }
         public string full_name { get; set; }
         public string attributes { get; set; }
         public string bounding_box { get; set; }
         public string place_type { get; set; }
         public string id { get; set; }
         public string country_code { get; set; }
         public string country { get; set; }

     }

     public class TwitterSearchQuery
     {
         public string type { get; set; }
         public string url { get; set; }
     }

定義一個WebClient的Object

private WebClient wc;

建立一個方法用來執行這個 Restful Service Call

private void GetTwitterGeoSearchResult{
   wc = new WebClient();
//定義OpenReadCompletedEventHandler 用來處理 Restful Service 的Response
            wc.OpenReadCompleted += new OpenReadCompletedEventHandler(wc_OpenReadCompleted);
我們可以使用 OpenReadAsync 來執行這個Restful Service Call
            wc.OpenReadAsync(new Uri("https://api.twitter.com/1/geo/search.json?query=hong%20kong"));
          }

void wc_OpenReadCompleted(object sender, OpenReadCompletedEventArgs e)
        {
//先檢查有沒有錯誤信息..當錯誤信是Null是我們繼續
            if (e.Error == null)
            {

//我們需要建立一個DataContractJsonSerializer  用來打這個 Stream轉換成我們的Object
                DataContractJsonSerializer data = new DataContractJsonSerializer(typeof(TwitterResponse));
使用ReadObject這個功能轉換 Stream到之前定義好的Object
                TwitterResponse response = (TwitterResponse)data.ReadObject(e.Result);
//之後我們便可以用這個Object取資料了
                MessageBox.Show(response.result.places[0].country);
	    }
	}

請注意:
當使用DataContractJsonSerializer 的時候我們需要加入

using System.Runtime.Serialization.Json;

這個Namespace的
如果在你的Project上找不到的話..
你可能需要加入 System.ServiceModel 這個DLL

Hope you find it useful