{"id":99,"date":"2013-08-06T11:01:55","date_gmt":"2013-08-06T11:01:55","guid":{"rendered":"https:\/\/praveenkatiyar.wordpress.com\/?p=99"},"modified":"2013-08-06T11:01:55","modified_gmt":"2013-08-06T11:01:55","slug":"modifying-array-of-structures-default-marshaling","status":"publish","type":"post","link":"https:\/\/praveenkatiyar.in\/blog\/index.php\/2013\/08\/06\/modifying-array-of-structures-default-marshaling\/","title":{"rendered":"Modifying array of structures (default marshaling)"},"content":{"rendered":"<p>Let\u2019s assume you have a user defined structure \u201c<strong><font color=\"#0000ff\">EMPLOYEE<\/font><\/strong>\u201d in a win32 DLL (let say it \u201c<strong>Win32Native.dll<\/strong>\u201d) as shown below.<\/p>\n<p><font color=\"#0000ff\" size=\"2\" face=\"Courier New\"><strong>typedef struct _EMPLOYEE        <br \/>{         <br \/>&#160;&#160;&#160; int Age ;         <br \/>&#160;&#160;&#160; int Sex;         <br \/>&#160;&#160;&#160; double Salary ;         <br \/>&#160;&#160;&#160; char* FirstName ;         <br \/>&#160;&#160;&#160; char* LastName ;         <br \/>} EMPLOYEE;         <br \/><\/strong><\/font><\/p>\n<p>Define some functions in native dll (let say it \u201c<strong>Win32Native.dll<\/strong>\u201d)&#160; as shown below.&#160; <\/p>\n<p><font size=\"2\"><font face=\"Courier New\"><strong><font color=\"#0000ff\">extern &quot;C&quot; __declspec(<font color=\"#0000ff\">dllexport) void <\/font><\/font><font color=\"#0000ff\">ModifyArrayOfEmployeeStruct(int nSize, EMPLOYEE* pArray);<\/font><\/strong><\/font><\/font><\/p>\n<h3>Implementing Functions<\/h3>\n<p><font color=\"#0000ff\" face=\"Courier New\"><strong>extern &quot;C&quot; __declspec(dllexport) void ModifyArrayOfEmployeeStruct( int nSize, EMPLOYEE* pArray)        <br \/>{         <br \/>&#160;&#160;&#160; int result = 0;         <br \/>&#160;&#160;&#160; EMPLOYEE* pCur = pArray;         <br \/>&#160;&#160;&#160; STRSAFE_LPSTR temp1, temp2 ;         <br \/><\/strong><\/font><font color=\"#0000ff\" face=\"Courier New\"><strong>&#160;&#160;&#160; for ( int i = 0; i &lt; nSize; i++ )        <br \/>&#160;&#160;&#160; {         <br \/>&#160;&#160;&#160;&#160;&#160;&#160;&#160; size_t nLen1 = 0;         <br \/>&#160;&#160;&#160;&#160;&#160;&#160;&#160; size_t nLen2 = 0;         <br \/>&#160;&#160;&#160;&#160;&#160;&#160;&#160; StringCchLengthA( pCur-&gt;FirstName, STRSAFE_MAX_CCH, &amp;nLen1 );         <br \/>&#160;&#160;&#160;&#160;&#160;&#160;&#160; StringCchLengthA( pCur-&gt;LastName, STRSAFE_MAX_CCH, &amp;nLen2 );         <br \/>&#160;&#160;&#160;&#160;&#160;&#160;&#160; <br \/>&#160;&#160;&#160;&#160;&#160;&#160;&#160; nLen1 = sizeof(char) * ( nLen1 + 11 );&#160;&#160;&#160; \/\/&#160;&#160;&#160; To accomodate &quot;&lt;Modified&gt;&quot;         <br \/>&#160;&#160;&#160;&#160;&#160;&#160;&#160; nLen2 = sizeof(char) * ( nLen2 + 11 );&#160;&#160;&#160; \/\/&#160;&#160;&#160; To accomodate &quot;&lt;Modified&gt;&quot;         <br \/>&#160;&#160;&#160;&#160;&#160;&#160;&#160; temp1 = (STRSAFE_LPSTR)CoTaskMemAlloc( nLen1 );         <br \/>&#160;&#160;&#160;&#160;&#160;&#160;&#160; temp2 = (STRSAFE_LPSTR)CoTaskMemAlloc( nLen2 );<\/strong><\/font><\/p>\n<p><font color=\"#0000ff\" face=\"Courier New\"><strong>&#160;&#160;&#160;&#160;&#160;&#160;&#160; StringCchCopyA( temp1, nLen1, (STRSAFE_LPCSTR)&quot;&lt;Modified&gt;&quot; );        <br \/>&#160;&#160;&#160;&#160;&#160;&#160;&#160; StringCbCatA( temp1, nLen1, (STRSAFE_LPCSTR)pCur-&gt;FirstName);<\/strong><\/font><\/p>\n<p><font color=\"#0000ff\" face=\"Courier New\"><strong>&#160;&#160;&#160;&#160;&#160;&#160;&#160; StringCchCopyA( temp2, nLen2, (STRSAFE_LPCSTR)&quot;&lt;Modified&gt;&quot; );        <br \/>&#160;&#160;&#160;&#160;&#160;&#160;&#160; StringCbCatA( temp2, nLen2, (STRSAFE_LPCSTR)pCur-&gt;LastName);         <br \/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; <br \/>&#160;&#160;&#160;&#160;&#160;&#160;&#160; \/\/ CoTaskMemFree must be used instead of delete to free memory.         <br \/>&#160;&#160;&#160;&#160;&#160;&#160;&#160; CoTaskMemFree( pCur-&gt;FirstName&#160; );         <br \/>&#160;&#160;&#160;&#160;&#160;&#160;&#160; CoTaskMemFree( pCur-&gt;LastName&#160; );<\/strong><\/font><\/p>\n<p><font color=\"#0000ff\" face=\"Courier New\"><strong>&#160;&#160;&#160;&#160;&#160;&#160;&#160; pCur-&gt;FirstName = (char *)temp1;        <br \/>&#160;&#160;&#160;&#160;&#160;&#160;&#160; pCur-&gt;LastName = (char *)temp2;<\/strong><\/font><\/p>\n<p><font color=\"#0000ff\" face=\"Courier New\"><strong>&#160;&#160;&#160;&#160;&#160;&#160;&#160; pCur-&gt;Age += 1 ;        <br \/>&#160;&#160;&#160;&#160;&#160;&#160;&#160; pCur-&gt;Salary&#160; += 1000.0 ;         <br \/>&#160;&#160;&#160;&#160;&#160;&#160;&#160; pCur++;         <br \/>&#160;&#160; }         <br \/>}<\/strong><\/font><\/p>\n<p><strong><\/strong><\/p>\n<h4>Point of Interest<\/h4>\n<li><strong>CoTaskMemAlloc is used to allocated the memory required. <\/strong><\/li>\n<li><strong>CoTaskMemFree <\/strong>is used to free any previously allocated buffer, if null is passed then, <strong>CoTaskMemFree <\/strong>is not called<strong>.<\/strong> <\/li>\n<li><strong>StringCchCopyA<\/strong> copies an ANSI string to a string buffer. <\/li>\n<li><strong>StringCbCatA<\/strong> Appends an ANSI string to a string buffer.\n<p>If you want to use a <strong>heap that is shared between native and managed<\/strong>, it is more common to use the COM heap. <\/p>\n<\/li>\n<li>On the native side use <a href=\"http:\/\/msdn.microsoft.com\/en-us\/library\/windows\/desktop\/ms692727.aspx\"><code><strong>CoTaskMemAlloc()<\/strong><\/code><\/a> and <a href=\"http:\/\/msdn.microsoft.com\/en-us\/library\/windows\/desktop\/ms680722.aspx\"><code><strong>CoTaskMemFree()<\/strong><\/code><\/a>.\n<p>&#160;<\/p>\n<h4>Writing the client code (the managed part) <\/h4>\n<p>one can simple create a console base application which can use this dll. let\u2019s name it <strong>MarshallingTest. <\/strong><\/p>\n<p>see the code snippet below.<\/p>\n<p><font color=\"#0000ff\" size=\"2\" face=\"Courier New\"><strong>using System;          <br \/>using System.Runtime.InteropServices;           <br \/>using System.Text;<\/strong><\/font><\/p>\n<p><font color=\"#0000ff\" size=\"2\" face=\"Courier New\"><strong>namespace MarshallingTest          <br \/>{<\/strong><\/font><\/p>\n<p><font color=\"#0000ff\" size=\"2\" face=\"Courier New\"><strong>&#160;&#160;&#160; [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Ansi)]          <br \/>&#160;&#160;&#160; public struct Employee           <br \/>&#160;&#160;&#160; {           <br \/>&#160;&#160;&#160;&#160;&#160;&#160;&#160; public int Age;           <br \/>&#160;&#160;&#160;&#160;&#160;&#160;&#160; public int Sex;           <br \/>&#160;&#160;&#160;&#160;&#160;&#160;&#160; public double Salary;           <br \/>&#160;&#160;&#160;&#160;&#160;&#160;&#160; public String FirstName;           <br \/>&#160;&#160;&#160;&#160;&#160;&#160;&#160; public String LastName;           <br \/>&#160;&#160;&#160; }           <br \/>&#160;&#160;&#160; class Program           <br \/>&#160;&#160;&#160; {           <br \/>&#160;&#160;&#160;&#160;&#160;&#160;&#160; [DllImport(&quot;Win32Native.dll&quot;)]<\/strong><\/font><\/p>\n<p><font color=\"#0000ff\" size=\"2\" face=\"Courier New\"><strong>&#160;&#160;&#160;&#160;&#160;&#160;&#160; public static extern int ModifyArrayOfEmployeeStruct(<\/strong><\/font><\/p>\n<p><font color=\"#0000ff\" size=\"2\" face=\"Courier New\"><strong>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; int nSize,<\/strong><\/font><\/p>\n<p><font color=\"#0000ff\" size=\"2\" face=\"Courier New\"><strong>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; [In, Out] Employee[] empArr);          <br \/>&#160;&#160;&#160;&#160;&#160;&#160;&#160; static void Main(string[] args)           <br \/>&#160;&#160;&#160;&#160;&#160;&#160;&#160; {           <br \/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; int nCnt = 5; \/\/ Number of Items in Structure Array <\/strong><\/font><\/p>\n<p><font color=\"#0000ff\" size=\"2\" face=\"Courier New\"><strong>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; Employee[] emp = new Employee[nCnt];          <br \/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; emp[0].FirstName = &quot;Ramesh&quot;; emp[0].LastName = &quot;Sharma&quot;; emp[0].Age = 42; emp[0].Salary = 40000; emp[0].Sex = 0;           <br \/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; emp[1].FirstName = &quot;Shalini&quot;; emp[1].LastName = &quot;Verma&quot;; emp[1].Age = 30; emp[1].Salary = 25000; emp[1].Sex = 1;           <br \/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; emp[2].FirstName = &quot;Ramesh&quot;; emp[2].LastName = &quot;Sharma&quot;; emp[2].Age = 51; emp[2].Salary = 35000; emp[2].Sex = 0;           <br \/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; emp[3].FirstName = &quot;Aarushi&quot;; emp[3].LastName = &quot;Shukla&quot;; emp[3].Age = 25; emp[3].Salary = 20000; emp[3].Sex = 0;           <br \/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; emp[4].FirstName = &quot;Malini&quot;; emp[4].LastName = &quot;Kapoor&quot;; emp[4].Age = 33; emp[4].Salary = 30000; emp[4].Sex = 1;<\/strong><\/font><\/p>\n<p><font face=\"Courier New\"><font color=\"#0000ff\" size=\"2\"><strong>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; Console.WriteLine(&quot;\\nEmployee Array Before Call&quot;);            <br \/><\/strong><\/font><font color=\"#0000ff\" size=\"2\"><strong>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; for (int nI = 0; nI &lt; nCnt; nI++)            <br \/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; {             <br \/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; StringBuilder sb = new StringBuilder( &quot;First Name=[&quot; );             <br \/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; sb.Append(emp[nI].FirstName);             <br \/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; sb.Append(&quot;]&#160; Last Name=[&quot;);             <br \/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; sb.Append(emp[nI].LastName );             <br \/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; sb.Append(&quot;]&#160; Age=[&quot;);             <br \/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; sb.Append(emp[nI].Age .ToString ());             <br \/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; sb.Append(&quot;]&#160; Salary=[&quot;);             <br \/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; sb.Append(emp[nI].Salary.ToString (&quot;F2&quot;));             <br \/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; sb.Append(&quot;]&#160; Sex=[&quot;);             <br \/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; sb.Append(((emp[nI].Sex == 0) ? &quot;Male&quot; : &quot;Female&quot;));             <br \/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; sb.Append(&quot;]&quot;);             <br \/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; Console.WriteLine(sb.ToString ());             <br \/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; }<\/strong><\/font><\/font><\/p>\n<p><font color=\"#0000ff\" size=\"2\" face=\"Courier New\"><strong>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; \/\/ Call the Function.<\/strong><\/font><\/p>\n<p><font color=\"#0000ff\" size=\"2\" face=\"Courier New\"><strong>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; ModifyArrayOfEmployeeStruct(emp.Length, emp);          <br \/><\/strong><\/font><\/p>\n<p><font color=\"#0000ff\" size=\"2\" face=\"Courier New\"><strong>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; Console.WriteLine(&quot;\\nEmployee Array After Call&quot;);          <br \/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; for (int nI = 0; nI &lt; nCnt; nI++)           <br \/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; {           <br \/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; StringBuilder sb = new StringBuilder(&quot;First Name=[&quot;);           <br \/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; sb.Append(emp[nI].FirstName);           <br \/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; sb.Append(&quot;]&#160; Last Name=[&quot;);           <br \/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; sb.Append(emp[nI].LastName);           <br \/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; sb.Append(&quot;]&#160; Age=[&quot;);           <br \/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; sb.Append(emp[nI].Age.ToString());           <br \/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; sb.Append(&quot;]&#160; Salary=[&quot;);           <br \/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; sb.Append(emp[nI].Salary.ToString(&quot;F2&quot;));           <br \/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; sb.Append(&quot;]&#160; Sex=[&quot;);           <br \/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; sb.Append(((emp[nI].Sex == 0) ? &quot;Male&quot; : &quot;Female&quot;));           <br \/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; sb.Append(&quot;]&quot;);           <br \/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; Console.WriteLine(sb.ToString());           <br \/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; }<\/strong><\/font><\/p>\n<p><font color=\"#0000ff\" size=\"2\" face=\"Courier New\"><strong>&#160;&#160;&#160;&#160;&#160;&#160;&#160; }          <br \/>&#160;&#160;&#160; }           <br \/>}           <br \/><\/strong><\/font><\/p>\n<p><strong><\/strong><\/p>\n<p><strong><\/strong><\/p>\n<h4>Point of Interest<\/h4>\n<\/li>\n<li><strong>namespace System.Runtime.InteropServices;<\/strong>&#160; defines the declarations necessary for Interop operations, like <strong>DllImport<\/strong>, <\/li>\n<li><strong>DllImport<\/strong> defines the DLL entry point.\n<p>compile and execute you will get following output.<\/p>\n<p><a href=\"http:\/\/praveenkatiyar.wordpress.com\/wp-content\/uploads\/2013\/08\/image4.png\"><img loading=\"lazy\" decoding=\"async\" title=\"image\" style=\"background-image:none;padding-top:0;padding-left:0;display:inline;padding-right:0;border-width:0;\" border=\"0\" alt=\"image\" src=\"http:\/\/praveenkatiyar.wordpress.com\/wp-content\/uploads\/2013\/08\/image_thumb4.png\" width=\"722\" height=\"198\" \/><\/a><\/p>\n<\/li>\n","protected":false},"excerpt":{"rendered":"<p>Let\u2019s assume you have a user defined structure \u201cEMPLOYEE\u201d in a win32 DLL (let say it \u201cWin32Native.dll\u201d) as shown below. typedef struct _EMPLOYEE { &#160;&#160;&#160; int Age ; &#160;&#160;&#160; int Sex; &#160;&#160;&#160; double Salary ; &#160;&#160;&#160; char* FirstName ; &#160;&#160;&#160; char* LastName ; } EMPLOYEE; Define some functions in native dll (let say it \u201cWin32Native.dll\u201d)&#160;&hellip; <a class=\"more-link\" href=\"https:\/\/praveenkatiyar.in\/blog\/index.php\/2013\/08\/06\/modifying-array-of-structures-default-marshaling\/\">Continue reading <span class=\"screen-reader-text\">Modifying array of structures (default marshaling)<\/span><\/a><\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[3,9,15],"tags":[17,28],"class_list":["post-99","post","type-post","status-publish","format-standard","hentry","category-codeproject","category-interoperability","category-win32","tag-net","tag-marshaling","entry"],"jetpack_featured_media_url":"","_links":{"self":[{"href":"https:\/\/praveenkatiyar.in\/blog\/index.php\/wp-json\/wp\/v2\/posts\/99","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/praveenkatiyar.in\/blog\/index.php\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/praveenkatiyar.in\/blog\/index.php\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/praveenkatiyar.in\/blog\/index.php\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/praveenkatiyar.in\/blog\/index.php\/wp-json\/wp\/v2\/comments?post=99"}],"version-history":[{"count":0,"href":"https:\/\/praveenkatiyar.in\/blog\/index.php\/wp-json\/wp\/v2\/posts\/99\/revisions"}],"wp:attachment":[{"href":"https:\/\/praveenkatiyar.in\/blog\/index.php\/wp-json\/wp\/v2\/media?parent=99"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/praveenkatiyar.in\/blog\/index.php\/wp-json\/wp\/v2\/categories?post=99"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/praveenkatiyar.in\/blog\/index.php\/wp-json\/wp\/v2\/tags?post=99"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}